2010-09-29 4 views
14

Это, вероятно, довольно простой, но я не в состоянии понять, как фраза, так что здесь идет речь для Google: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

+0

см. Мои изменения в примечаниях ... а также просмотрите Руководство по классам и объектам: http://php.net/manual/en/language.oop5.php – prodigitalson

+0

Спасибо за расширенный пример, я вижу, как вы это сделали. Я хочу, чтобы вы могли просто объявить что-то объектом, так как вы можете объявить его массивом. Это позволило бы мне «лучше проверить код»: мне не нравится, когда пользователям нужно вызвать родительский конструктор, потому что они, кажется, всегда забывают и не могут понять, почему вещи не работают. Однако иногда вы должны делать то, что должны делать. Спасибо за помощь!! – Andrew

Смежные вопросы