5

誰かがこの動作の論理を説明してもらえますか?

次の状況を考慮してください。

class EPPDomain
{
    protected $myField;

    public static function buildEPPDomain($fieldValue)
    {
        $me = new self();
        $me->myField = $fieldValue;
        return $me;
    }

    public function __set($name, $value)
    {
        $this->$name = "prefix_".value;
    }
}

class EPPDomainFactory
{
    public static function buildEPPDomain($fieldValue)
    {
        $me = new EPPDomain();
        $me->myField = $fieldValue;
        return $me;
    }
}

そう

$dmn = EPPDomain::buildEPPDomain("myValue");
echo $dmn->myField;

期待される

prefix_myValue

実際

myValue

明らかに、

$dmn = EPPDomainFactory::buildEPPDomain("myValue");
echo $dmn->myField;

期待通りの出力

prefix_myValue

http://www.php.net/manual/en/language.oop5.overloading.php#object.setの__setの説明によると

__set() は、アクセスできないプロパティにデータを書き込むときに実行されます。

EPPDomain クラスの静的メソッドで EPPDomain のインスタンスを作成すると、すべての保護されたプロパティにアクセスできないはずです。したがって、__set を呼び出す必要がありますが、そうではありません

私はそれが言うことも知っています

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

しかし、__set メソッドはクラス メンバー関数であるべきであり、静的であってはならないということだけが述べられている印象があります。それだけで、私が直面している状況とは何の関係もないようです。

それはバグですか、それとも予想される動作ですか?

4

2 に答える 2

5

protectedプロパティは、同じクラスまたは継承クラス内のすべてのコードからアクセスできます。クラスに重点が置かれています。

class Foo {

    protected $bar;

    public function foo() {
        $foo = new self;
        $foo->bar = 'baz';
    }

}

これはうまくいきます。クラスはそれ自体のインスタンスで動作しており、独自のプロパティにアクセスできます。それは「外部インスタンス」ではなく、クラスに関するものです。

保護されたプロパティのポイントは、それらの存在または実装が、それらを定義するクラスにのみ関連する必要があるということです。他のコードがそれらを直接いじってはいけません。クラスはそれ自身のプロパティを処理する方法を知っていると想定できるため、クラスはそのタイプの任意のオブジェクトのプロパティを操作できると信頼されています。

于 2013-08-08T13:11:33.197 に答える
0

メソッドはそのクラスのインスタンスの保護された (さらにはプライベートな) プロパティにアクセスできるため、これは予想される動作です。

于 2013-08-08T13:10:03.047 に答える