ho una classe astratta genitore Mongo_Document
(da mongodb-php-odm) e una classe ereditata Model_ActionPlan
. Mongo_Document
dispone di metodi __isset e __get magici che interagiscono con una matrice all'interno della classe Mongo_Document
.PHP classe bambino lavora __isset magia, ma __get non
Sto cercando di utilizzare il seguente codice (frammento all'interno di un metodo di Model_ActionPlan
): (. Si noti che close_type
è garantito per essere impostata se status == 'closed'
)
if (isset($this->status))
{
if (($this->status === "closed") AND ($this->close_type != "failure"))
{
return;
}
}
I isset
chiamata restituisce true
e quindi l'esecuzione procede alla successiva dichiarazione. Lì, ricevo il seguente errore:
Undefined property: Model_ActionPlan::$status
Tuttavia, se sostituisco $this->status
con parent::__get('status')
, questo codice funziona come previsto. Si noti che in ogni altro nel programma, sono in grado di utilizzare:
$ap = new Model_ActionPlan($plan_id);
echo $ap->status;
// Prints 'closed' (or 'active') as expected
E 'solo qui, all'interno della classe stessa, che questo non funziona.
Mi sono guardato intorno e non riesco a trovare da nessuna parte che dice che i metodi magici non possono essere chiamati nella classe bambino. Potrei usare la chiamata , ma penso che sia probabilmente il modo sbagliato per farlo. Qualcuno sa se esiste un modo giusto/migliore per farlo?
Aggiornato # 1 2012/12/16: il codice completo della classe padre è here on Github.
Aggiornato # 2 2012/12/18: Per le persone che hanno chiesto di dove o se è impostato correttamente, la risposta è che, dal momento chiamando parent::__get('status')
fa lavoro, il problema non è, ovviamente, che la variabile non viene impostato. Il __get()
riceve i dati da una variabile privata di instace denominata _object
. Se I var_dump($this)
, vedo che $this->_object['status']
corrisponde a uguale al valore "chiuso" previsto.
Aggiornamento # 3: Il codice della classe bambino è disponibile a https://gist.github.com/4332062. La parte importante inizia on line 69.
ho visto this similar question ma che si sta utilizzando il metodo magia di un genitore per ottenere le proprietà del bambino e il mio problema sta usando getter del genitore per ottenere le proprietà del genitore.
Quale versione di PHP sei? Questo non dovrebbe accadere. –
Sto usando '5.4.8-NTS-VC9 (Windows FastCGI)' sul mio computer locale e '5.3.10-1ubuntu3.4' sul mio server di test. Il problema si verifica su entrambi. –
Ho provato a riprodurre il problema creando una classe base con metodi magici e quindi estendendolo, ma non sembra che questo mostri il problema che stai riscontrando. –