Betrachten Sie diese Klasse:Wie vermeidet PHP hier unendliche Rekursion?
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;
}
}
ich PHP Magie __set()
Methode bin überlasten. Immer wenn ich eine Eigenschaft in einem Objekt der Klasse test
einstelle, wird sie __set()
aufrufen, die wiederum other_set()
aufruft.
$obj = new test;
$test->prop = 10;
/* prints the following */
__set() called
other_set() called
Aber other_set()
hat die folgende Zeile $this->$name = $value
. Sollte dies nicht zu einem Aufruf von __set()
führen, was zu einer unendlichen Rekursion führt?
Ich theoretisierte, dass es __set()
nur aufrufen würde, wenn Dinge außerhalb der Klasse gesetzt werden. Aber wenn Sie die Methode t()
aufrufen, können Sie sehen, dass es auch __set()
übertrifft.
Das ist richtig. Wenn jemand die Implementierungsdetails sehen möchte, ist es in 'zend_object_handlers.c'. – Confluence
@Confluence: Danke ... ich habe mich gefragt, wo ich das gelesen habe. :) Konnte es nicht im Handbuch finden; Ich begann mich zu fragen, ob ich es mir vorgestellt hatte. Aber alle meine Tests bestätigten es, also ... – cHao
Diese Antwort war SO nützlich! –