Dado
abstract class A { public function __get($key) { ... } } class B extends A { public function __get($key) { ... } } class C { public function test($bObject) { //Call the __get function of A on the object of B } }¿Cómo llamaría a A::__get en un objeto de B desde C::test? He buscado usar un invocable en la clase A::__get y vincularlo al objeto de la clase B, o usar parent, pero ninguno de esos métodos parece ayudar.
En PHP, una forma de hacerlo es con reflexión ( introspección o también metaprogramación ), ya que por el diseño de clase/objeto, la encapsulación normalmente lo prohíbe.
Dado lo siguiente de las definiciones de clase en cuestión:
$b = new B(); $b->test; Funciona obteniendo el cierre del método de los padres con el objeto B (por ejemplo $bObject en su pregunta o $b en el ejemplo aquí) y luego llamándolo:
(new ReflectionObject($b)) ->getParentClass() ->getMethod('__get') ->getClosure($b)('test'); // or: ->invoke($b, 'test');Demostración: https://3v4l.org/0tj26 y salida para PHP 7.3.0 - 7.3.29, 7.4.0 - 7.4.21, 8.0.0 - 8.0.8:
string(8) "B::__get" string(4) "test" string(8) "A::__get" string(4) "test"Intente usar ReflexionClass y el método getParent.
$objectB; $key = 'key'; $reflectorB = new ReflectionObject($objectB); $reflectorA = $reflectorB->getParentClass(); $method = $reflectorA->getMethod('__get'); return $method->invoke($objectB, $key);