Я хочу вызвать статический метод из класса variabe в PHP. Как уже несколько раз указывалось на SO и поскольку это обычная практика, следующее работает, как и ожидалось:
class Foo {
public function compile($strClass) {
$strClass::find(); // this works
}
}
Тем не менее мне приходится вызывать разные методы find из $ strClass из разных методов класса Foo. Вот почему я хочу хранить $ strClass в $ this-> strClass. К сожалению, это не работает:
class Foo {
protected $strClass;
public function __construct($strClass)
{
$this->strClass = $strClass;
}
public function compile($strClass) {
$this->strClass::find(); // this does not work
}
}
Любая идея или намек на то, как решить эту проблему?
Обновить:
Как указано в комментариях, это может быть решение использовать call_user_func следующим образом:
call_user_func(array($this->strClass, 'find'), $strParam);
В любом случае, это делает завершение кода в PHPstorm невозможным. Есть намеки на это? Может быть, с использованием аннотации кода?
Вы можете изменить свой метод компиляции на это:
public function compile($strClass) {
call_user_func(array($this->strClass, 'find'));
}
Этот класс дизайна имеет недостатки. Я бы попытался полностью избавиться от статических методов, но вот решение, которое использует тот факт, что вы можете вызывать статические методы на объекты:
class Foo {
protected $strClass;
public function __construct($strClass)
{
$this->strClass = new $strClass;
}
public function compile($strClass) {
$this->strClass::find();
}
}
ОБНОВИТЬ: не берите в голову, это синтаксическая ошибка во всех текущих версиях PHP, на самом деле вы должны сделать это так:
$strClass = $this->strClass;
$strClass::find();
И это работает с вашим исходным кодом, где $this->strClass
это строка