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;

これを回避する方法についてのアイデアはありますか?

4

3 に答える 3

15

実際には「->」を使用して静的メソッドを呼び出すことができます。

$this->myArray['instanceOfMyClass']->staticMethod();
于 2012-07-17T10:44:53.860 に答える
6

これは非常に興味深い問題です。PHP 自体のバグである可能性もあります。

回避するには、KISS 原則を使用します。

class RunCode
{
    private $myArray;

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

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

お役に立てれば!

于 2012-07-17T10:05:53.680 に答える
5

たとえば、一時変数を使用して 1 つのライナーを分割する必要があります。

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

これは、PHP のコンパイラがネストされた式を理解するほど賢くない多くのケースの 1 つです。PHP 開発者は最近これを改善していますが、まだやるべきことがあります。

于 2012-07-17T10:07:56.030 に答える