Вызов статического метода из переменной массива объекта

В PHP вы можете вызвать статический метод класса из экземпляра объекта (который содержится в массиве) следующим образом:

$myArray['instanceOfMyClass']::staticMethod(); // works

Но по какой-то причине, когда я использую переменную $this, я получаю ошибку синтаксического анализа. Например:

$this->myArray['instanceOfMyClass']::staticMethod(); // PARSING ERROR

Просто, чтобы проиллюстрировать, что я имею в виду:

class MyClass{
    public static function staticMethod(){ echo "staticMethod called\n"; }
}

$myArray = array();
$myArray['instanceOfMyClass'] = new MyClass;
$myArray['instanceOfMyClass']::staticMethod(); // works

class RunCode
{
    private $myArray;

    public function __construct(){
        $this->myArray = array();
        $this->myArray['instanceOfMyClass'] = new MyClass;
        $this->myArray['instanceOfMyClass']::staticMethod(); // PARSING ERROR
    }
}

new RunCode;

Любые идеи о том, как обойти это?

Ответы

Ответ 1

Фактически вы можете использовать "- > " для вызова статического метода:

$this->myArray['instanceOfMyClass']->staticMethod();

Ответ 2

Это действительно интересная проблема, это может быть даже ошибка в самом PHP.

Для работы используйте принцип KISS.

class RunCode
{
    private $myArray;

    public function __construct(){
        $this->myArray = array();
        $this->myArray['instanceOfMyClass'] = new MyClass;

        $instance = $this->myArray['instanceOfMyClass']
        $instance::staticMethod();
    }
}

Надеюсь, это поможет!

Ответ 3

Вам придется разбить один лайнер с помощью временной переменной, например.

$inst = $this->myArray['instanceOfMyClass'];
$inst::staticMethod()

Это один из многих случаев, когда компилятор PHP недостаточно умен, чтобы понимать вложенные выражения. В последнее время PHP-разработчики улучшают это, но еще предстоит сделать.