2012-07-18 18 views
1

所以現在有兩件事情我被困住了。第一個php類和數組至少對我來說是瘋狂的

class DisplayTaxonomy { 
public $MyArray[]= new DisplayTaxonomy(); //the compiler says syntax error 
//things I have tried 
//public $ss[]= new Object(); 


} 

第二!在這樣的功能:

public function whatever() 
{ 
    $Temp = new DisplayTaxonomy(); 
    $Temp->setADTitle("1"); 
    $MyArray[]= $Temp;//works just fine. 
    //then i tried to return the array 
     return $MyArray[]; 


} 

我得到以下 //不能用[],用於讀取C:\ XAMPP \ htdocs中\ WordPress的\ WP - //內容\主題\ twentyeleven \ page.php文件上線52 然後在客戶端

$y=new DisplayTaxonomy(); 
$myArray[]=new DisplayTaxonomy();//works fine dont know why I cant do this in theclass. 
$myArray[]=$y->getArrayOfDisplayTaxonomyObjects(); 
echo $myArray[0]->getADTitle(); 
+0

我建議你一次只問一個問題,那就是這個網站的效果最好。當然,你可以同時提出兩個問題(如果你還需要的話)。 – hakre 2012-07-18 21:05:34

+1

到目前爲止所有答案的一般性評論。在構造函數中使用'new'語句的所有解決方案都會引發報警! – markus 2012-07-18 21:09:04

回答

3

看來你要創建一個處理分類對象的集合類。在這種情況下,你應該有兩個類,而不是自己創建一個類存儲實例。

class TaxonomyContainer 
{ 
    private $collection = array(); 

    public function addElement(DisplayTaxonomy $element) 
    { 
     $this->collection[] = $element; 
    } 

    public function getElements() 
    { 
     return $this->collection; 
    } 
} 

class DisplayTaxonomy 
{ 
    private $adTitle; 

    public function setAdTitle($adTitle) 
    { 
     $this->adTitle = $adTitle; 
    } 

    //and other functionality the Taxonomy object should have 
} 

然後,您可以避免醜陋的自我複製行爲,並分開您的疑慮。

$container = new TaxonomyContainer(); 
$element = new DisplayTaxonomy(); 
$container->addElement($element); 

在一個新的水平,它可能是值得考慮的容器類使用PHP's predefined interfaces之一。

+0

我最終做了兩堂課。 – hidden 2012-07-21 19:00:35

2

你的第一個問題是在試圖給你打電話要聲明的類。

class DisplayTaxonomy { 
    public $MyArray[]= new DisplayTaxonomy(); 

你應該初始化對象的類之外,在代碼,你需要引用類的部分。

此外,對象已經是一個數組,所以你可以省略附加[]到底return $MyArray

public function whatever(){   
    $Temp = new DisplayTaxonomy(); 
    $Temp->setADTitle("1"); 

    $MyArray[] = $Temp; 

    return $MyArray; 
} 

你在這裏聲明數組對象:

$MyArray[]= $Temp;//works just fine 
+0

但是如何在我的類中聲明數組對象屬性 – hidden 2012-07-18 20:55:36

+0

請參閱我的編輯。以前在'$ MyArray [] = $ Temp;''上使用'[]''會初始化數組。你只需要在聲明或添加數組時添加'[]',而不是返回。 – RobB 2012-07-18 20:59:01

2

你申報對象在函數體中並在構造函數(或成員函數)中啓動它們。返回數組時,您不使用[]$array[]具有與array_push相同的功能,僅此而已。

爲了澄清,

class myClass { 

    public $obj = array(); 

    public function __construct() { 
     $this->obj[] = new OtherObject(); 
    } 

    public function getObj() { 
     return $this->obj; 
    } 
} 
+0

'[]'用作'array_push'和*的替代來初始化數組*。 – RobB 2012-07-18 21:02:26

+0

好工作。但我注意到你使用obj []和fiskfisk使用obj – hidden 2012-07-18 21:02:43

+0

我得到一個內存泄漏$ this-> MyArray = new DisplayTaxonomy(); – hidden 2012-07-18 21:30:23

0

不能調用代碼(新DisplayTaxonomy())definining類屬性的時候。你必須在類的構造函數賦值:

class Foo 
{ 
    public $MyArray; 

    public function __construct() 
    { 
     $this->MyArray = new DisplayTaxonomy(); 
    } 
} 

的另一個問題是,$數組[]快捷方式是附加到一個數組。如果你只想返回數組(而不是給你問有[]該數組),直接跳過[]:

return $MyArray; 

擴展:

文森特Joigƞie指出在下面;您正嘗試創建一個與您已創建的類名稱相同的類。除靜態屬性外,這沒有任何意義。在這種情況下,你不能使用__construct(),但寧願創建/設置你調用來檢索對象在第一時間靜態方法的對象:

static public function getInstance() 
{ 
    if (self::$MyArray === null) 
    { 
     self::$MyArray = new DisplayTaxonomy(); 
    } 

    return self::$MyArray; 
} 

然而,這可能不是你想要,而且看起來你已經在你的類定義中的邏輯中混淆了某些東西。隨意猜測你可能只是想:

class Foo 
{ 
    public $MyArray = array(); 
} 

由於陣列()是一個靜態分配(而不是函數調用),它允許在類定義。因爲它就像一個無限循環

class DisplayTaxonomy { 
    public $MyArray[]= new DisplayTaxonomy(); 
} 

:)所以,你必須使用__contruct()函數:

+0

幹得好。我不認爲事情必須通過構造函數初始化。 – hidden 2012-07-18 20:59:14

+0

是的內存泄漏是由於不是靜態的。 – hidden 2012-07-18 21:38:17

+0

這不是一個好的解決方案。 '靜態'是壞的,自我複製的對象也不好。 – markus 2012-07-18 22:00:14

2

你不能做到這一點。

變化後:

return $MyArray[]; 

到:

return $MyArray; 
+0

不是因爲它像一個無限循環(它仍然是用'__construct()'函數),而是因爲它不是一個常量。只有常數才能用於類成員的初始值。 – hakre 2012-07-18 21:07:51

+0

是的,但我們不能影響類var只是爲了避免這種問題:) – PoulsQ 2012-07-18 21:14:08

+0

是的構造函數或沒有構造函數是無限循環。 H – hidden 2012-07-18 21:38:34