2014-10-22 52 views
0

我有以下幾個屬性和PHP中的方法(這是簡化的代碼)的類。如何在PHP中創建「class」類型的數組?

class Member{ 
    public $Name; 
    public $Family; 

    public function Fetch_Name(){ 
     for($i=0;$i<10;$i++){ 
     $this[$i]->$Name = I find the name using RegExp and return the value to be stored here; 
     $this[$i]->Family = I find the family using RegExp and return the value to be stored here; 
     } 
    }//function 
}//class 

在功能Fetch_Name(),我想找到所有的名字和家庭是使用正則表達式的文本文件,並將它們存儲在一個數組的形式對象的屬性。但我不知道應該如何定義成員的數組。這是合乎邏輯的,或者我應該定義StdClass或二維數組而不是類?

我發現略有類似的討論here,但使用2維數組而不是使用類屬性在對象中存儲數據。

我認爲我的問題是在定義下面的代碼行。我們定義的成員不是數組。如果我確定它的數組,它仍然不起作用。我這樣做

$Member[]= new Member(); 

但它給錯誤

Fatal error: Call to a member function Fetch_name() on a non-object in

如果我給$會員[0] =新會員(),那麼我不知道如何使$會員1或會員[2 ]在Fetch_Name函數中等等。我希望我的問題不復雜也不合邏輯。

預先非常感謝

+0

您可以使用特定類中的對象填充數組,但PHP中不存在類型數組。 – Alternatex 2014-10-22 09:55:40

+0

我需要你解釋的。一個數組,可以由類中的對象填充。但我是股票。 – Espanta 2014-10-22 09:59:23

+0

提供的答案很不錯。我只是說你不能真正將一個數組鎖定爲只接受某種特定的對象。 – Alternatex 2014-10-22 10:03:05

回答

3

Member對象表示一個構件。你試圖超載它來表示或處理許多成員,這沒有任何意義。最終你會想與擁有許多Member實例,而不是周圍的其他方式的陣列來結束:

$members = array(); 
for (...) { 
    $members[] = new Member($name, $family); 
} 

最有可能你並不真的需要你Member什麼真正的;提取邏輯應位於Member類之外,可能位於Extractor類或類似的類中。從外面看,你的代碼可能是這樣的:

$parser = new TextFileParser('my_file.txt'); 
$members = $parser->extractMembers(); 
+0

謝謝,但這裏有一個問題。我不知道一開始有多少成員,而$ member []的長度取決於文本文件中的名稱數量。那麼,我如何構建for循環呢? – Espanta 2014-10-22 09:50:23

+0

無論如何,你大多可能不想要'for'循環。您的提取器類需要解析該文件,並找出有多少名稱,並根據需要實例化許多「成員」。我不能告訴你如何編寫解析器(這就是你真正想問的),因爲我不知道需求是什麼。詢問關於該問題的單獨問題。 – deceze 2014-10-22 09:57:04

1

我想你應該有兩類:

  • 第一個,提取程序(或者稱其爲你喜歡的),你的功能。
  • 第二個成員,與屬性名稱和家庭。

這不是一個會員的工作,你的文本中獲取,這就是爲什麼我會做另一類。

在你的函數,做你的工作,並在循環,這樣做:

for($i = 0; $i < 10; ++$i){ 
    $member = new Member(); 
    $member->setName($name); 
    $member->setFamily($family); 
    // The following is an example, do what you want with the generated Member 
    $this->members[$i] = $member; 
} 
1

這裏的問題是,你沒有正確使用類會員爲數組的對象。代碼的正確格式將是:

class Member{ 
    public $Name; 
    public $Family; 

    public function Fetch_Name(){ 
     for($i=0;$i<10;$i++){ 
     $this->Name[$i] = 'I find the name using RegExp and return the value to be stored here'; 
     $this->Family[$i] = 'I find the family using RegExp and return the value to be stored here'; 
     } 
    } 
} 

首先,$this->Name$this->$Name因爲名稱已經被聲明作爲成員變量和$this->Name[$i]是正確的語法因爲$this參考當前對象,它可以不被轉換爲陣列,本身。該數組必須包含在成員變量中。

L.E:我可能會補充說,您不是根據PHP命名標準編寫代碼。這不會影響您的功能,但以標準方式編寫代碼是一種很好的做法。畢竟,有一個標準的目的。

Here你有一個指導如何做到這一點。

而且我會寫這樣的代碼:

class Member{ 
    public $name; 
    public $family; 

    public function fetchName(){ 
     for($i=0;$i<10;$i++){ 
     $this->name[$i] = 'I find the name using RegExp and return the value to be stored here'; 
     $this->family[$i] = 'I find the family using RegExp and return the value to be stored here'; 
     } 
    } 
} 

L.E2:看到你在上面comented什麼,我將修改我的答案是這樣的:

那麼,你是說你在調用之後,必須將一個對象的值存儲到數組中。那麼,after的關鍵詞是這裏:

  1. 初始化你的對象VAR: $member = new Memeber(); $memebr->fechNames();

  2. 初始化和數組中的foreach

    $Member = new Member(); 
    
    foreach ($Member->Name as $member_name){ 
        $array['names'][] = $member_name; 
    } 
    
    foreach ($Member->Family as $member_family) { 
        $array['family'][] = $member_family; 
    } 
    var_dump($array); 
    

這是更多你想要的東西?

希望它能幫助!
繼續編碼!
阿瑞斯。

+0

Tnx戰神,但你sa是一個類的屬性是數組,對嗎? – Espanta 2014-10-22 09:54:00

+0

是的。該對象被創建,您可以在同一個屬性中保存許多結果。我雖然這是你想要的:)測試它,如果沒有,請更加明確,所以我可以幫助你更好:D – 2014-10-22 09:57:50

+0

Tnx Ares。讓我圍繞它開展工作。 – Espanta 2014-10-22 10:03:26