4

以下のコードが「TEST」を2回しか出力しない理由がわかりません。

<?php

class A {
    private $test = "TEST<br />";

    public static function getInstance() {
        return new self();
    }

    public static function someStaticMethod() {
        $a = new self();
        $a->test;
    }

    public function __get($args) {
        echo $this->$args;
    }
}

/* echo's "TEST" */
$a = new A();
$a->test;

/* echo's "TEST" */
$a2 = A::getInstance();
$a2->test;

/*
No output... eeerhm... how come?
Why is $a->test (inside someStaticMethod()) not being overloaded by __get ??
*/
A::someStaticMethod();

?>

PHPサイトは言う(リンク):

プロパティのオーバーロードは、オブジェクト コンテキストでのみ機能します。これらの魔法のメソッドは、静的コンテキストではトリガーされません。したがって、これらのメソッドは static と宣言しないでください。PHP 5.3.0 以降、魔法のオーバーロード メソッドの 1 つが static と宣言されている場合、警告が発行されます。

しかし、彼らは魔法のメソッドを静的に宣言する必要があると言っていると思います。例えば:

public static 関数 __get(){}

さらに、実際にオブジェクトコンテキストで使用しているという事実。$a = 新しい自己(); 変数 $a のクラス A からインスタンスを返します。次に、$a->test (オブジェクト コンテキスト imo?) を使用して、プライベートな「テスト」変数をフェッチし、それをオーバーロードする必要があります...

私は混乱しています...

4

2 に答える 2

3

マニュアルから:

オーバーロード メソッドは、宣言されていない、または現在のスコープで表示されないプロパティまたはメソッドと対話するときに呼び出されます。

静的メソッドを呼び出している場合someStaticMethod()、プライベート $test は現在のスコープで表示されるため、魔法の __get メソッドは呼び出されません。

于 2012-09-06T19:21:46.767 に答える
2

のコンテキストではA:: someStaticMethod、PHP ではプライベート変数に直接アクセスできるよう$testになっているため、マジック メソッドは実行されていないようです。そこecho $a->test;からアクセスすると、アクセスされていることがわかります。

PHP Manualによると、これは予想される動作です。

同じタイプのオブジェクトは、同じインスタンスではありませんが、お互いのプライベート メンバーと保護されたメンバーにアクセスできます。これは、実装固有の詳細が、これらのオブジェクトの内部ですでにわかっているためです。

于 2012-09-06T19:25:58.477 に答える