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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top