У меня есть желание сохранить объект как свойство класса. Затем я хочу иметь возможность вызвать статические методы в этом классе, напрямую ссылаясь на свойство.
Рассмотрим следующее:
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 ().