El método padre heredado de PHP no puede acceder a la propiedad privada del niño

Antes que nada: un problema bastante similar ha sido publicado y de alguna manera ya se ha resuelto, pero aún no responde a mi problema específico. Más sobre esto más tarde.

En palabras: Tengo una clase base que proporciona algunos métodos para todos los niños, pero no contiene ninguna propiedad. Mi hijo está heredando estos métodos, que deberían usarse para acceder a las propiedades del niño. Si la propiedad del niño está protected o es public , todo funciona bien, pero si la propiedad del niño es private , falla sin error (simplemente no pasa nada).

En codigo:

 class MyBaseClass { public function __set($name, $value) { if(!property_exists($this, $name)) throw new Exception("Property '$name' does not exist!"); $this->$name = $value; } } class ChildClass extends MyBaseClass { public $publicProperty; protected $protectedProperty; private $privateProperty; } $myChild = new ChildClass(); $myChild->publicProperty = 'hello world'; //works of course! $myChild->protectedProperty = 'hello world'; //works as expected $myChild->privateProperty = 'hello world'; //doesn't work? 

El problema similar mencionado anteriormente tiene la solución para usar el __set() mágico __set() para acceder a las propiedades privadas, pero esto ya lo estoy haciendo. Si implemento __set() dentro del niño, funciona, por supuesto, pero la idea es que el niño herede el __set() de su padre, pero obviamente no puede acceder al método privado del niño.

¿Eso es a propósito? ¿Estoy haciendo algo mal? o es mi enfoque simplemente basura por diseño?

Antecedentes: Mi idea original fue: toda la dinámica acerca de __set() es algo que no me gusta. Por lo general, una propiedad privada nunca debería ser accesible desde el exterior, así que implementé el lanzamiento de __set- y __get-methods en mi última clase base (de la cual todas las clases heredan).

Ahora quiero generar dinámicamente una instancia a partir de un archivo XML y, por lo tanto, necesito acceder a las propiedades. Hice la regla, que cualquier clase XML instanciable necesita implementar el __set() mágico __set() y así se puede crear dinámicamente. En lugar de implementarlo en todas las clases que podrían generarse algún día, decidí hacer que heredasen de una clase llamada class Spawnable { } que proporciona el necesario __set-method.

Esta es la diferencia entre private y protected . Los métodos privados y las propiedades no se pueden heredar ni alcanzar. Tendrá que cambiarlos a protegido en su lugar.

Ver el manual de visibilidad

Se puede acceder a los miembros declarados protegidos solo dentro de la clase en sí y por las clases heredadas y principales. Los miembros declarados como privados solo pueden acceder a la clase que define al miembro.

Supongo que podrías crear algo usando Reflection. Por ejemplo, en tu clase Spawnable:

 public function __set($name, $value) { $reflector = new ReflectionClass(get_class($this)); $prop = $reflector->getProperty($name); $prop->setAccessible(true); $prop->setValue($this, $value); } 

No obstante, el código más bonito.

Después de revisar mi concepto, creo que es una mala idea, seguir ese enfoque. Este es un problema general con la falta de diferencia entre propiedades y campos de PHP. Por supuesto, los campos privados nunca deberían ser accesibles desde afuera, sino solo las propiedades, que son definidas por el progtwigdor. La ausencia de auto-propiedades (y no me refiero a estos métodos mágicos __set() y __get() ) o algunas reglas convencionales para el acceso a la propiedad, hace que sea difícil adivinar qué convención de nomenclatura ha sido utilizada por el progtwigdor al implementar setters para campos privados en su clase.

El mejor concepto aquí podría ser, basarse en la existencia de setters bien nombrados para cada clase spawnable, aunque podría romperse, si alguien contribuyó con el código, que no está implementando los setters llamados convencionales esperados.

Sin embargo, muchas gracias por tus pensamientos y sugerencias.