Operador de resolución de alcance en variables de clase

Tengo curiosidad por saber por qué el uso del operador de resolución de alcance en las variables de clase provoca un error fatal de php, y si hay alguna forma de evitarlo.

Por ejemplo:

<?php
class StaticTest
{
    public static function output()
    {
        echo "Output called<br />";
    }
}
Class Test
{
    public $reference;

    public function __construct()
    {
        $this -> reference = new StaticTest;
    }

}

$static_test = new StaticTest;
$static_test::output(); //works as intended

$test = new Test;
$test -> reference::output(); //Unexpcted T_PAAMAYIM_NEKUDOTAYIM

$direct_reference = $test -> reference;
$direct_reference::output(); //works, closest solution i have found, but requires the extra line of code / variable
?>

preguntado el 30 de junio de 12 a las 23:06

PHP tiene todo tipo de reglas/errores tontos de "esto no puede ir después de eso". Solo tendrás que usar una variable. -

{$test -> reference}::output();? Los frenos siempre son buenos cuando existe una posible ambigüedad... -

¿Funciona si lo intentas? ($test -> reference)::output()? -

@Eric Qué cosa tan rara de decir... Notice: Undefined variable: in es claramente mejor. Aunque me gusta un buen Paamayim Nekudoayim. Buenos separadores de título de página. Nada como un poco de hebreo para alegrar el día. -

@Eric o este -

1 Respuestas

Si su única preocupación es la cantidad de líneas de código y la variable adicional, así es como puede hacerlo en una línea, sin crear ninguna variable:

call_user_func(array(get_class($test->reference), 'output'));

Lo cual, creo, es equivalente a:

$direct_reference = $test->reference;
$direct_reference::output();

Respondido el 30 de junio de 12 a las 23:06

Guau, desagradable. Aunque me gusta el pensamiento lateral, +1 - DaveRandom

Creo que también es desagradable, pero la única queja del OP al respecto fue "requiere la línea adicional de código/variable" y lo resolví :-P - Marcos Eirich

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.