我有一個問題,一直在破壞我想要做很長一段時間的事情的方式。這與使用magic get和set in PHP並試圖對對象進行預增量有關。我有一個PHP類這樣的:用PHP預先增加魔法獲取和設置定義
class Foo {
public $object;
function __construct() {
$this->object = array("bar" => 1);
}
function & __get($name) {
return $this->object[$name];
}
function __set($name, $value) {
echo "Old value: ". $this->object[$name] ." - New value: ". $value ."\n";
$this->object[$name] = $value;
}
}
注意&
在__get
方法。現在我運行此代碼:
$o = new Foo();
echo "First test\n";
$o->bar = 2;
echo "Second test\n";
$o->bar = $o->bar + 1;
echo "Third test\n";
$o->bar += 1;
echo "Fourth test\n";
++$o->bar;
,輸出是:
First test
Old value: 1 - New value: 2
Second test
Old value: 2 - New value: 3
Third test
Old value: 4 - New value: 4
Fourth test
Old value: 5 - New value: 5
第三和第四測試有意想不到的(由我)的行爲。看起來像$ this-> object ['bar']返回要設置的值,而不是我期望的舊值。在實際設置之前,價值是如何設定的?
如果我從__get
方法中刪除&
,這將起作用,所以我想這與PHP所做的引用管理有關。但我期望第三次測試的行爲與第二次測試的行爲相同,但事實並非如此。
我真的不明白這一點。任何幫助將非常感激。
我一直認爲第三個測試會被翻譯成類似於第二個的東西。這種行爲給了我一些嚴重的問題。 – makmonty
@Portnoy解決方法是養成總是使用'$ var ++'的習慣,除非您需要將新值作爲較大操作的一部分 - 只有在那時您才使用'++ $ var'。 – DaveRandom
是的,但是我正在處理的系統中必須支持預增量。我遇到這個問題的真正的類將以不同的私有屬性存儲在對該對象所做的更改中,以便它只將那些已更改的字段推送到數據庫。有了這種行爲,我無法分辨新值是否與前一個值實際不同,所以我現在的做法是在保存對象時更新每個字段,因爲預先增量會導致條件失敗。 – makmonty