12

このクラスを検討してください。

class test
{
    public function __set($n, $v)
    {
        echo "__set() called\n";
        $this->other_set($n, $v, true);
    }

    public function other_set($name, $value)
    {
        echo "other_set() called\n";    
        $this->$name = $value;
    }

    public function t()
    {
        $this->t = true;
    }
}

PHPの魔法の__set()メソッドをオーバーロードしています。test クラスのオブジェクトにプロパティを設定すると、それは、を呼び出し__set()、次にはを呼び出しますother_set()

$obj = new test;
$test->prop = 10;

/* prints the following */
__set() called
other_set() called

しかしother_set()、次の行があります$this->$name = $value。これにより、が呼び出され__set()、無限再帰が発生するのではないでしょうか。

__set()私はそれがクラスの外に物事を設定するときだけ呼び出すだろうと理論づけました。しかし、メソッドを呼び出すと、t()それも明確に通過していることがわかり__set()ます。

4

2 に答える 2

12

__set指定されたプロパティ名に対して、試行ごとに1回だけ呼び出されます。 それ(またはそれが呼び出すもの)が同じプロパティを設定しようとすると、PHPは__set再度呼び出すことはなく、オブジェクトにプロパティを設定するだけです。

于 2012-04-04T19:24:20.837 に答える
2

ドキュメントから:

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

例えば:

class foo {
  private $attributes;
  public $bar;

  public function __construct() {
    $this->attributes = array();
  }

  public function __set($n, $v) {
    echo "__set() called\n";
    $this->attributes[$n] = $v;
  }
}

$x = new foo;
$x->prop = "value";
$x->attributes = "value";
$x->bar = "hello world";

この場合、$x->propはアクセスできず、__set呼び出されます。 $x->attributesアクセスできないので、__setと呼ばれます。ただし、$x->bar一般公開されているため、呼び出され__setませ

同様に、__setメソッドで$this->attribtuesは、にアクセスできるため、再帰はありません。

上記のサンプルコードで$this->$nameは、呼び出されたスコープでアクセスできるため、呼び出され__setません。

于 2012-04-04T19:19:06.183 に答える