sobrecarga serialize overload métodos method magicos php inheritance mongodb-php magic-methods

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