2010-09-29 10 views
14

Questo probabilmente è piuttosto semplice, ma non sono stato in grado di capire come formulare la domanda per Google, quindi ecco qui:PHP: dichiarare una variabile di classe ad essere un oggetto stdClass

Quindi, faccio spesso qualcosa di simile ...

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

... per impostare alcune proprietà di classe come array. Tuttavia, mi piacerebbe fare una proprietà privata di un oggetto, invece, qualcosa di simile:

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

ho provato diverse varianti di questo e nessuno di loro ha funzionato. Può essere fatto? Per i punti bonus puoi assegnare una proprietà privata come qualsiasi altra classe di oggetti?

Grazie!

risposta

16

Non è possibile utilizzare le funzioni (compresi i costruttori) nelle dichiarazioni dei membri della classe. Invece installarlo nel costruttore per 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); 

E quando si estende la classe e la necessità di eseguire l'override del costruttore, ma vuole ancora la roba nel costruttore classi genitore:

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

Va inoltre notato questo non ha nulla a che fare con la visibilità di la proprietà ... non importa se è il suo protected, private o public.

+0

Ok, questo funziona. Tuttavia, cosa succede se voglio che questa classe sia estensibile da altre classi che potrebbero sovrascrivere il costruttore? C'è un modo per assicurarsi che $ bar rimanga un oggetto? – Andrew

+0

vedere le mie modifiche di note ... e anche rivedere il Manuale di classi e oggetti: http://php.net/manual/en/language.oop5.php – prodigitalson

+0

Grazie per l'esempio esteso, vedo come l'hai fatto. Vorrei che tu potessi semplicemente dichiarare qualcosa come un oggetto nel modo in cui puoi dichiararlo come un array. Ciò mi permetterebbe di "infallibilizzare" il codice meglio: non mi piace chiedere agli utenti di chiamare il costruttore genitore perché sembrano sempre dimenticare e non essere in grado di capire perché le cose non funzionano. Tuttavia, a volte devi fare quello che devi fare. Grazie per l'aiuto!! – Andrew

Problemi correlati