2010-09-29 104 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