2010-09-29 22 views
14

Ésta es probablemente bastante simple, pero no he sido capaz de encontrar la manera de expresar la pregunta de Google, así que aquí va:PHP: declarar una variable de clase a ser un objeto stdClass

Por lo tanto, hago a menudo algo como esto ...

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

... para establecer una propiedad de clase para que sea una matriz. Sin embargo, me gustaría hacer una propiedad privada en lugar de un objeto, algo como esto:

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

He intentado varias variaciones de este y ninguno de ellos funcionó. Se puede hacer esto? Para los puntos de bonificación, ¿puede asignar una propiedad privada para que sea cualquier otra clase de objeto?

Gracias!

Respuesta

16

No se pueden usar funciones (incluidos los constructores) en las declaraciones de miembros de la clase. En su lugar, configúralo en el constructor de la clase.

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

Y cuando extiende la clase y la necesidad de redefinir el constructor, pero todavía quiere las cosas en el constructor de clases de padres:

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

También debe tenerse en cuenta esto no tiene nada que ver con la visibilidad de la propiedad ... no importa si es protected, private o public.

+0

Ok, eso funciona. Sin embargo, ¿qué sucede si quiero que esta clase sea extensible por otras clases que pueden anular el constructor? ¿Hay alguna forma de garantizar que $ bar se mantenga como un objeto? – Andrew

+0

ver mis notas edita ... y también revisar el Manual de clases y objetos: http://php.net/manual/en/language.oop5.php – prodigitalson

+0

Gracias por el ejemplo extendido, veo cómo lo hizo. Desearía que simplemente pudieras declarar que algo es un objeto de la manera que puedes declararlo como una matriz. Esto me permitiría "a prueba de tontos" el código mejor: no me gusta pedirles a los usuarios que llamen al constructor padre porque parecen olvidarlo siempre y no ser capaces de descubrir por qué las cosas no funcionan. Sin embargo, a veces tienes que hacer lo que tienes que hacer. ¡¡Gracias por la ayuda!! – Andrew

Cuestiones relacionadas