$ var :: staticfunction () ОК, но $ this-> var :: staticfunction () NOT. В чем смысл?

В 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.' } 

Эта причуда беспокоила меня какое-то время. Поэтому мне было интересно:

  • Является ли это общим ограничением среди языков ООП?
  • Может ли кто-нибудь, знакомый с внутренними PHP, объяснить, почему $this->classname::somefunction() не является желательным синтаксисом?

Это не должно спровоцировать бурю комментариев «php sux». Я хорошо знаю особенности языка. Я просто хотел бы знать, есть ли причина для этого, кроме «просто так росла».

Это действительно ограничение, и есть причина для этого: оператор :: scope имеет более высокий приоритет над -> что означает, что:

 $this->otherclass::ALIAS; 

будет читаться как:

 ($this->(otherclass::ALIAS)); 

поэтому вызывает ошибку.

Это на самом деле функция, которую PHP унаследовал, вероятно, с помощью C ++.

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

Я вряд ли мог бы назвать это «ограничением», и это, безусловно, не «причуда». PHP тоже не может испечь хлеб.

Действительно, если вы видите код $this->classname::somefunction() , он сразу же делает для вас интуитивный смысл? Неа. Хорошо, что вы не можете этого сделать.