設法在對象上創建一個新的屬性。但是,有人可以用支持鏈接來解釋爲什麼setAttrib
有兩種不同的表現方式嗎?爲什麼它不會導致......等待它......堆棧溢出!! ??PHP:__set函數行爲每次都不相同
class Test
{
public function setAttrib($key, $value) {
echo "setAttrib\n";
// first time: calls $this->__set($key, $value)
// second time: just sets a public property (but, when exactly was it created?)
$this->$key = $value;
}
public function __set($key, $value) {
echo "__set\n";
$this->setAttrib($key, $value);
}
}
$test = new Test();
$test->setAttrib('hey', 'It works');
var_dump($test);
產生...
setAttrib
__set
setAttrib
object(Test)#1 (1) {
["hey"]=>
string(8) "It works"
}
編輯:我不是在尋找一種替代。 我正在尋找這個工程的原因。
不知道它是否會改變任何東西,但你的__set方法應該是公開的(參見http://www.php.net/manual/en/language.oop5.overloading.php,其中指出「所有重載方法必須定義爲公共。「 - 以及在運行代碼時得到的警告) – 2009-12-22 20:24:14
是的,你就在那裏,我將它改爲公開。同樣的行爲。 – 2009-12-22 20:28:16
至少,這是一個警告,沒有更多的^^(我沒想到它會別人改變什麼,這就是爲什麼我只發佈的評論;但一個警告了總是一件好事) – 2009-12-22 20:35:25