serialize - PHP Child class Magic__isset funciona pero__get no
public function__ get (2)
La función __get en el padre es algo compleja, por lo que no he descubierto completamente si lo siguiente podría estar sucediendo o no. Si su función __get, una vez llamada, está de alguna manera activando otra llamada a sí misma (quizás con algunas llamadas intermedias a otras funciones en la pila), esto es exactamente lo que sucedería.
Consulte http://php.net/manual/en/language.oop5.overloading.php#55486 , que muestra exactamente el mismo tipo de error que se está registrando cuando el captador activa una llamada a sí mismo. En ese caso, es bastante fácil de detectar, pero con un gráfico de llamadas más complicado de algo como func () a __get () a funcB () a funcC () a __get (), no sería fácil de detectar.
Tengo una clase padre abstracta Mongo_Document
(de mongodb-php-odm ) y una clase heredada Model_ActionPlan
. Mongo_Document
tiene Mongo_Document
mágicos __isset y __get que interactúan con una matriz dentro de la clase Mongo_Document
.
Estoy tratando de usar el siguiente código (fragmento de un método de Model_ActionPlan
):
if (isset($this->status))
{
if (($this->status === "closed") AND ($this->close_type != "failure"))
{
return;
}
}
(Tenga en cuenta que se garantiza que close_type
se establecerá si el status == ''closed''
.)
La llamada isset
devuelve true
y luego la ejecución continúa a la siguiente declaración. Allí, recibo el siguiente error:
Undefined property: Model_ActionPlan::$status
Sin embargo, si sustituyo $this->status
con parent::__get(''status'')
, este código funciona como se esperaba. Tenga en cuenta que en cualquier otro lugar del programa, puedo usar:
$ap = new Model_ActionPlan($plan_id);
echo $ap->status;
// Prints ''closed'' (or ''active'') as expected
Es solo aquí, dentro de la clase misma, que esto no funciona.
Miré a mi alrededor y parece que no puedo encontrar ningún lugar que diga que los métodos mágicos no pueden ser llamados en la clase infantil. Podría usar el parent::__get
call en su lugar, pero creo que probablemente sea la forma incorrecta de hacerlo. ¿Alguien sabe si hay una manera correcta / mejor de hacer esto?
Actualizado # 1 2012-12-16: El código completo de la clase padre está aquí en Github .
Actualizado # 2 2012-12-18: Para las personas que preguntaron dónde o si está configurado correctamente, la respuesta es que dado que llamar a parent::__get(''status'')
funciona, el problema obviamente no es que la variable no esté no se establezca. El __get()
obtiene sus datos de una variable de _object
privada llamada _object
. Si var_dump($this)
, veo que $this->_object[''status'']
es igual al valor esperado de "cerrado".
Actualización # 3: El código de la clase secundaria está disponible en https://gist.github.com/4332062 . La parte importante comienza en la línea 69.
He visto una pregunta similar, pero esa es sobre el uso del método mágico de un padre para obtener las propiedades del niño y mi problema es usar el captador del padre para obtener las propiedades del padre.
No estoy seguro si estoy en lo correcto pero no deberías usar
$this->_object[''status'']
en lugar de
$this->status