2010-09-29 12 views
14

Ceci est probablement assez simple, mais je n'ai pas été en mesure de comprendre comment formuler la question pour Google, va ici:PHP: déclarer une variable de classe pour être un objet stdClass

Alors, je fais souvent quelque chose comme ça ...

class foo { 
    private $bar = array(); 
} 

... pour définir une propriété de classe comme un tableau. Cependant, je voudrais faire une propriété privée un objet au lieu, quelque chose comme ceci:

class foo { 
    private $bar = new stdClass(); 
} 

J'ai essayé plusieurs variantes de ce et aucun d'entre eux travaillaient. Cela peut-il être fait? Pour les points bonus, pouvez-vous attribuer une propriété privée à une autre classe d'objet?

Merci!

Répondre

16

Vous ne pouvez pas utiliser de fonctions (y compris les constructeurs) dans les déclarations de membre de classe. Au lieu de cela, configurez-le dans le constructeur de la classe.

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); 

Et quand vous étendez la classe et la nécessité de remplacer le constructeur, mais voulez toujours les choses dans le constructeur des classes parent:

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); 

Il convient également de noter cela n'a rien à voir avec la visibilité de la propriété ... ce n'est pas grave si c'est protected, private, ou public.

+0

Ok, ça marche. Cependant, que se passe-t-il si je veux que cette classe puisse être étendue par d'autres classes qui peuvent surcharger le constructeur? Y at-il un moyen de s'assurer que $ bar reste un objet? – Andrew

+0

voir mes notes édite ... et aussi passer en revue le manuel des classes et des objets: http://php.net/manual/fr/language.oop5.php – prodigitalson

+0

Merci pour l'exemple étendu, je vois comment vous l'avez fait. Je souhaite que vous puissiez simplement déclarer quelque chose comme un objet de la façon dont vous pouvez le déclarer comme un tableau. Cela me permettrait de mieux "déjouer" le code: je n'aime pas obliger les utilisateurs à appeler le constructeur parent parce qu'ils semblent toujours oublier et ne pas être capables de comprendre pourquoi les choses ne fonctionnent pas. Cependant, parfois tu dois faire ce que tu dois faire. Merci pour l'aide!! – Andrew