我已經安裝了PHP 5.2 在我的一個測試電腦今天一對夫婦的位代碼,以前的版本工作正常 5.1.6 投擲致命的錯誤在新版本. 該錯誤信息是“嵌套層次太深 - 遞歸的依賴?“用了一點時間
在PHP中有兩個比較操作符, ==和===. 這是一般人都知道,第一個是關於類型,但是不嚴格,二是. 所以, 例如
迴聲 ( 虛假 == 0 ); // 真
迴聲 ( 虛假 === 0 ); // 假
- 0 是一個整數和虛假是一個布爾
我的問題源於使用非嚴格的分型與對象.
$A =新MyObj中();
$B =新MyObj中();
如果( $A == $ B )
…
我沒有考慮我在做什麼用此代碼. 當比較兩個對象使用非嚴格比較運算符 (==) PHP的所有屬性進行比較的對象,如果它們匹配的對象被認為是平等的. 如果他們不匹配,他們是不相等. 有效, 我們有一個遞歸的比較所有的屬性,每個對象, 和他們所有的財產, 等等. 直到我們達到的基本數據類型,如字符串和整數.
如果, 然而, 我們使用嚴格的比較 (===), PHP將檢查是否兩個對象是相同的對象, 不僅具有相同屬性的對象.
類 MyObj中
{
市民為 $ p;
}$A =新MyObj中();
$B =新MyObj中();
$C =新MyObj中();
$A ->P值 1;
$B ->P值 1;
$C ->P值 2;
迴聲 ( $A == $ C ); // 假
迴聲 ( $A == $ B ); // 真
迴聲 ( $一個 === $ B ); // 假
出現的問題如果你有在你的循環引用的對象的屬性. 所以, 例如
類 MyObj中
{
市民為 $ p;
}
類 OtherObj
{
公眾的$ q;
}$A =新MyObj中();
$B =新OtherObj();
$A ->p = $ b不等;
$B ->為 Q = $ 1; // 循環引用: $A ->P ->=== q $ 1$C =新MyObj中();
$D =新OtherObj();
$C ->P值$ d個;
$D ->為 Q = $ ç;// 另一種循環引用: $C ->P ->q $ ç ===迴聲 ( $A == $ C ); // 致命錯誤:
過深的嵌套級別 – 遞歸的依賴?
為了比較 $ 1到$ ç, PHP必須比較它們的性能. 因此,在PHP的邏輯是這樣想的: $A == $ C $ A ->p == $c->P如果$ A ->p->q == $ C ->p->●如果$ A ->p == $ C ->p ==P -c->p->Q ->P等. 無限期.
PHP 5.1 似乎對這個問題有點順利 (可能在一定程度後,它只是返回false遞歸) – 通常它制定了罰款. PHP 5.2 正確產生致命錯PHP的以上.
一旦你知道的問題, 該解決方案是很容易 – 使用嚴格的比較.
迴聲 ( $一個 === $ C ); // 假 (並沒有錯誤)
嚴格的檢查比較簡單地將兩個對象是否是在同一位置在內存中,所以甚至不看的屬性值.
注:. 同樣的問題出現時可以使用否定比較運算符 (使用 !==而不是 !=) 當使用in_array (使用in_array的第三個參數表明嚴格比較).
