您不能在类成员声明中使用函数(包括构造函数)。相反,在类的构造函数中进行设置。
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