This method can be used to call a overwritten public method of a parent class on an child instance
The following code will output "A":
<?php
class A
{
public function foo()
{
return __CLASS__;
}
}
class B extends A
{
public function foo()
{
return __CLASS__;
}
}
$b = new B();
$reflection = new ReflectionObject($b);
$parentReflection = $reflection->getParentClass();
$parentFooReflection = $parentReflection->getMethod('foo');
$data = $parentFooReflection->invoke($b);
echo $data;
?>
ReflectionMethod::invoke
(PHP 5)
ReflectionMethod::invoke — Invoca un método
Descripción
Invoca al método reflexionado.
Parámetros
-
object -
Objeto al que pertenece el método invocado. En métodos estáticos, se podrá introducir null en este parámetro.
-
parameter -
Cero o más parámetros para pasar a este método. Acepta un número variable de parámetros, que se pasarán al método.
Valores devueltos
Devuelve el resultado del método.
Errores/Excepciones
Lanza ReflectionException si el parámetro object
no contiene una instancia de la clase en la que se declaró este método.
Lanza ReflectionException si fallara la invocación al método.
Ejemplos
Ejemplo #1 Ejemplo de ReflectionMethod::invoke()
<?php
class HolaMundo {
public function saludarA($nombre) {
return 'Hola ' . $nombre;
}
}
$metodoReflexionado = new ReflectionMethod('HolaMundo', 'saludarA');
echo $metodoReflexionado->invoke(new HolaMundo(), 'Miguel');
?>
El resultado del ejemplo sería:
Hola Miguel
Notas
Nota:
Si la función tiene argumentos que necesitan ser referencias, éstos deben ser referencias en la lista de argumentos pasados.
Ver también
- ReflectionMethod::invokeArgs() - Invoca un método con argumentos
- __invoke()
- call_user_func() - Llamar a una llamada de retorno dada por el primer parámetro
Seems that Reflection doesn`t resolve late static bindings - var_dump will show "string 'a' (length=1)".
<?php
class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
class ChildClass extends ParentClass { protected static $a = 'b'; }
$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>
Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).
