Как получить статическое свойство из динамического объекта в одном выражении? - PullRequest
0 голосов
/ 06 сентября 2018

После замены некоторых моих нестатических переменных на статические переменные я получил несколько выражений, похожих на приведенное здесь. Это вызывает синтаксическую ошибку, но я не могу понять, почему.

Class Bar  {
    public static $name = "bar";
}

Class Foo {
    public function getParent(){
        $this->parentClass = new Bar();
        return $this;
    }
}

$foo = (new Foo())->getParent();
echo ($foo->parentClass)::$name; //this line is throwing a syntax error

//output:
PHP Parse error:  syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

Если я назначу объект переменной, он не выдаст ошибку:

$class = $foo->parentClass;
echo $class::$name;
//outputs "bar";

Я мог бы предположить, что возможно столкнулся с каким-то непредвиденным порядком проблем с операциями, но не могу понять, почему это синтаксическая ошибка, и мне интересно, есть ли способ сделать это в однострочном выражении. (Так как эта проблема была вызвана массовым поиском / заменой, было бы неплохо сохранить ее в одну строку)

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Это немного уродливо, но если вам действительно нужен однострочный:

echo get_class_vars(get_class($foo->parentClass))["name"];

Вдохновлен этим ответом

DEMO

0 голосов
/ 07 сентября 2018

На самом деле это возможно только в PHP 7.0. Измененное поведение плохо документировано. Я думаю, что это скорее ошибка, чем новая функция.

Однако наиболее близким решением к «однострочнику» (работающему в 5.6), похоже, является следующее:

$bar = (new Foo())->getParent()->parentClass;
echo $bar::$name; 

Может быть, это не то, чего вы пытались достичь. Важно то, что статический класс доступен только после помещения его в одну переменную.

Я рекомендую срочно перейти на PHP7.

...