2010-09-29 150 views
14

這可能是很簡單,但我一直無法弄清楚如何短語谷歌的問題,所以這裏有雲:PHP:聲明一個類變量是一個stdClass的對象

所以,我經常這樣做這樣的事情...

class foo { 
    private $bar = array(); 
} 

...設置某些類屬性是一個數組。不過,我想提出一個私有財產的對象,而不是,是這樣的:

class foo { 
    private $bar = new stdClass(); 
} 

我想這幾個變化,沒有他們的工作。這可以做到嗎?對於獎勵積分,您可以將私人財產分配給任何其他類別的對象嗎?

謝謝!

回答

16

您不能在類成員聲明中使用函數(包括構造函數)。相反,在類的構造函數中進行設置。

class Foo { 

    private $bar; 

    private $baz; 

    public function __construct() { 

    $this->bar = new stdClass(); 
    $this->baz = new Bat(); 

    } 

    public function __get($key) { 
     if(isset($this->$key) { 
     return $this->$key; 
     } 

     throw new Exception(sprintf('%s::%s cannot be accessed.', __CLASS__, $key)); 
    } 

} 


$foo = new Foo(); 

var_dump($foo->bar); 
var_dump($foo->bat); 

當你擴展這個類,需要重寫構造函數,但仍希望在父類的構造函數的東西:

class FooExtended 
{ 
    protected $coolBeans; 

    public function __construct() { 

     parent::__construct(); // calls the parents constructor 

     $this->coolBeans = new stdClass(); 
    } 
} 

$foo = new FooExtended(); 

var_dump($foo->bar); 
var_dump($foo->bat); 
var_dump($foo->coolBeans); 

還應當注意這有沒有關係的可視性財產...它不要緊,如果它protected,private,或public

+0

好的,那是有效的。然而,如果我想讓這個類可以被其他可以重載構造函數的類擴展的話呢?有沒有辦法確保$ bar保持對象? – Andrew 2010-09-29 05:09:21

+0

查看我的筆記編輯...並查看類和對象手冊:http://php.net/manual/en/language.oop5.php – prodigitalson 2010-09-29 05:20:46

+0

感謝您的擴展示例,我明白您是如何做到的。我希望你可以簡單地聲明一些東西,你可以聲明它是一個數組。這將允許我更好地「更好地防止」代碼:我不喜歡要求用戶調用父構造函數,因爲他們似乎總是忘記,並且無法弄清楚爲什麼事情不起作用。但是,有時你必須做你必須做的事情。謝謝您的幫助!! – Andrew 2010-09-29 05:23:47