Вопрос по static, php, arrays, object – Вызов статического метода из переменной массива объекта

15

В 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;

Есть идеи как обойти это?

использованиеcall_user_func(array($this->myArray['instanceOfMyClass'], 'staticMethod')); Federkun
static = использовать self :: not $ this- & gt; Waygood
Сожалею? Я не думаю, что вы понимаете, что я пытаюсь сделать. Я просто пытаюсь вызвать статический метод из экземпляра объекта MyClass, который является записью в RunCode-> myArray. Mark

Ваш Ответ

3   ответа
5

Вам придется разбить один вкладыш, используя временную переменную, например,

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

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

Спасибо! Да, я согласен, синтаксис PHP довольно неинтуитивен. Mark
15

Вы действительно можете использовать & quot; - & gt; & quot; вызвать статический метод:

$this->myArray['instanceOfMyClass']->staticMethod();
Да. Это кажется вполне безопасным, поскольку вы не можете добавить в класс нестатический метод с тем же именем.
Ого, я никогда не осознавал этого, спасибо. Так что вы можете использовать только - & gt; вызывать статический метод, если он находится на созданном объекте? Mark
Почему PHP должен быть таким нелогичным? В любом случае спасибо за отзыв.
6

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

Чтобы обойти это, используйте принцип KISS.

class RunCode
{
    private $myArray;

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

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

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

Спасибо, да, я думаю, это самое простое решение. Моя самая большая любимая часть PHP - отсутствие поддержки синтаксиса, который, как вы могли бы предположить, сработает. Например. $ var = myFunction () [0]. Как вы думаете, стоит ли сообщать об ошибке? Mark

Похожие вопросы