PHP ejecutable objeto como miembro
Pregunta
Tengo un Logger
clase que, entre otras cosas tiene una Log
método.
Como Log
es el uso más común de la instancia Logger
, he atado con alambre __invoke
llamar Log
Otra clase, "Site" contiene un miembro de "Log", una instancia de Logger.
¿Por qué este trabajo:
$Log = $this->Log;
$Log("Message");
Pero no esto:
$this->Log("Message");
La primera falla con "error fatal de PHP: Llamada a indefinido Sitio método :: Log ()"
¿Es esta una limitación de la implementación del objeto exigible, o estoy mal entendido algo?
Solución
Las mismas razones por las que no se puede hacer esto:
$value = $this->getArray()["key"];
o incluso este
$value = getArray()["key"];
Debido a la sintaxis de PHP no hace corta la mano muy bien.
Otros consejos
Por desgracia, esto es (todavía) una limitación de PHP, pero tiene sentido cuando se piensa en ello, como una clase puede contener propiedades y métodos que comparten nombres. Por ejemplo:
<?php
class Test {
public $log;
public function __construct() {
$this->log = function() {
echo 'In Test::log property';
};
}
public function log() {
echo 'In Test::log() method';
}
}
$test = new Test;
$test->log(); // In Test::log() method
call_user_func($test->log); // In Test::log property
?>
Si PHP diera lugar a que la sintaxis que desee, cuya función se invoca? Por desgracia, que sólo nos deja con call_user_func[_array]()
(o $this->log
copiado a otra variable e invocando eso).
Sin embargo, sería bueno si la sintaxis siguiente era aceptable:
<?php
{$test->log}();
?>
Pero, por desgracia, no lo es.
Esto puede funcionar:
${this->Log}("Message");
Pero quizás es más fácil y mejor utilizar la llamada completa? No parece ser una manera de conseguir lo que quiere trabajar en la misma línea.
El error en su pregunta indica que está en busca de una función definida en la clase que no existe. Un objeto invocable no es una función, y parece que no puede ser tratado como uno en este caso.