您不能在類成員聲明中使用函數(包括構造函數)。相反,在類的構造函數中進行設置。
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
。
好的,那是有效的。然而,如果我想讓這個類可以被其他可以重載構造函數的類擴展的話呢?有沒有辦法確保$ bar保持對象? – Andrew 2010-09-29 05:09:21
查看我的筆記編輯...並查看類和對象手冊:http://php.net/manual/en/language.oop5.php – prodigitalson 2010-09-29 05:20:46
感謝您的擴展示例,我明白您是如何做到的。我希望你可以簡單地聲明一些東西,你可以聲明它是一個數組。這將允許我更好地「更好地防止」代碼:我不喜歡要求用戶調用父構造函數,因爲他們似乎總是忘記,並且無法弄清楚爲什麼事情不起作用。但是,有時你必須做你必須做的事情。謝謝您的幫助!! – Andrew 2010-09-29 05:23:47