В PHP может быть доступен статический член или функция, если имя класса является допустимым объектом или строкой. Это в основном верно. Когда строка имени класса является свойством объекта, его нельзя использовать напрямую. Он должен быть скопирован в простую переменную, прежде чем ее можно будет использовать для доступа к статическому члену. Вот пример:
class Foo { protected $otherclass='Bar'; //string! function out(){ $class=$this->otherclass; echo $class::ALIAS; //Where everyone knows your name. } function noout_err(){ echo $this->otherclass::ALIAS; //syntax error, unexpected '::' } } class Bar { const ALIAS='Where everyone knows your name.' }
Эта причуда беспокоила меня какое-то время. Поэтому мне было интересно:
$this->classname::somefunction()
не является желательным синтаксисом? Это не должно спровоцировать бурю комментариев «php sux». Я хорошо знаю особенности языка. Я просто хотел бы знать, есть ли причина для этого, кроме «просто так росла».
Это действительно ограничение, и есть причина для этого: оператор ::
scope имеет более высокий приоритет над ->
что означает, что:
$this->otherclass::ALIAS;
будет читаться как:
($this->(otherclass::ALIAS));
поэтому вызывает ошибку.
Это на самом деле функция, которую PHP унаследовал, вероятно, с помощью C ++.
Да, вы не можете этого сделать, и нет явной причины для этого. Просто нет синтаксиса, испортив грамматику, чтобы обеспечить этот крайний край, для которого вы уже продемонстрировали, что существует тривиальное обходное решение.
Я вряд ли мог бы назвать это «ограничением», и это, безусловно, не «причуда». PHP тоже не может испечь хлеб.
Действительно, если вы видите код $this->classname::somefunction()
, он сразу же делает для вас интуитивный смысл? Неа. Хорошо, что вы не можете этого сделать.