誰かがこの動作の論理を説明してもらえますか?
次の状況を考慮してください。
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 メソッドはクラス メンバー関数であるべきであり、静的であってはならないということだけが述べられている印象があります。それだけで、私が直面している状況とは何の関係もないようです。
それはバグですか、それとも予想される動作ですか?