PHP, вызов статического метода в свойстве класса

У меня есть желание сохранить объект как свойство класса. Затем я хочу иметь возможность вызвать статические методы в этом классе, напрямую ссылаясь на свойство.

Рассмотрим следующее:

class myModel { public static function all() { return 1; } } class myClass { public $models; public function __construct() { $this->models->myModel = new myModel; $results = $this->models->myModel::all(); } } $result = new myClass; 

PHP не работает на $results = $this->models->myModel::all();

Если я изменю это, назначив свойство класса локальной переменной, все будет работать так, как ожидалось:

 $myModel = $this->models->myModel; $results = $myModel::all(); 

Я хотел бы исключить необходимость присвоить свойство класса локальной переменной.

Возможно ли это в PHP 5.3.x (версия, которую я использую) или, действительно, в более поздних версиях?

Решение должно быть читаемым, и цель кода не должна быть иным образом запутана.

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

Синтаксическая ошибка, которую вы получите, это:

Ошибка анализа: синтаксическая ошибка, неожиданный «::» (T_PAAMAYIM_NEKUDOTAYIM)


Однако он будет работать в PHP 7 благодаря унифицированному синтаксису RFC . Для всех предыдущих версий потребуется промежуточная переменная.

Причина, по которой он терпит неудачу на $results = $this->models->myModel::all(); потому что в публичных свойствах $ models из myClass нет свойства myModel (с момента его запуска NULL), к которому вы пытаетесь получить доступ -> myModel. Поскольку вы сохранили экземпляр myModel внутри $ models, не существующего экземпляра myModel, он, вероятно, не создан правильно. Вам нужно исправить это $this->models->myModel = new myModel; to $this->models = new myModel; также, так как $ models не является объектом с свойством myModel, но вы пытались получить доступ к ist. Затем модели $ this-> напрямую указывают на объект myModel, и вы можете получить доступ к статическому методу с помощью $ this-> models :: all ().