这可能很简单,但我无法弄清楚如何为谷歌提问,所以这里有:
所以,我经常这样做......
class foo {
private $bar = array();
}
...将一些类属性设置为数组。但是,我想将私有属性改为对象,如下所示:
class foo {
private $bar = new stdClass();
}
我尝试了几种变体,但都没有奏效。可以这样做吗?对于奖励积分,您可以将私有财产分配为任何其他类别的对象吗?
谢谢!
答案 0 :(得分:20)
您不能在类成员声明中使用函数(包括构造函数)。而是将其设置在类的构造函数中。
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
都无关紧要。