Considerate questa classe:In che modo PHP evita la ricorsione infinita qui?
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;
}
}
sto sovraccarico metodo magico __set()
di PHP. Ogni volta che imposto una proprietà in un oggetto della classe test
, chiameremo __set()
, che a sua volta chiama other_set()
.
$obj = new test;
$test->prop = 10;
/* prints the following */
__set() called
other_set() called
Ma other_set()
ha la seguente riga $this->$name = $value
. Non dovrebbe questo comportare una chiamata a __set()
, causando una ricorsione infinita?
Ho teorizzato che avrebbe chiamato __set()
solo quando si impostano le cose al di fuori della classe. Ma se chiami il metodo t()
puoi vederlo chiaramente anche attraverso lo __set()
.
Questo è corretto. Se qualcuno vuole vedere i dettagli dell'implementazione, è in "zend_object_handlers.c". – Confluence
@Confluence: Grazie ... mi stavo chiedendo dove avrei letto quello. :) Impossibile trovarlo nel manuale; Stavo iniziando a chiedermi se l'avessi immaginato. Ma tutti i miei test lo hanno confermato, quindi ... – cHao
Questa risposta è stata così utile! –