2012-04-12 49 views
3

我對simplexml評估有一個非常尷尬和特殊的問題。成功解析SimpleXMLElement與'false'的比較返回'true'

代碼:

$simplexml = simplexml_load_string($xmlstring); 
var_dump($simplexml); 
var_dump($simplexml == false); //this comparison 

的var_dump($ simplexml的)返回simplexml的我的實際結構,但比較返回「真」這個特定的SimpleXML,這是我無法證明,因爲我的合同結構。
我敢肯定,這是非常特定的問題,因爲我嘗試了其他XML字符串,並且比較返回'false'。

$simplexml = simplexml_load_string('<a><b>test</b></a>'); 
var_dump($simplexml); //returns the actual structure 
var_dump($simplexml == false); //returns false 

我使用'==='操作符解決了這個問題,但我並不滿足於讓它工作。我想了解爲什麼'=='運算符返回true。
我閱讀了關於這兩個操作符和SimpleXMLElement的內容,並且在我看來,它應該爲兩個操作符都返回'false'。 成功解析SimpleXMLElement和布爾型'false'以返回'true'之間進行比較的可能原因是什麼?

回答

1

看一看這裏: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

它說,從空標籤創建的SimpleXML對象評估爲假。也許這就是發生了什麼?

+0

這正是發生了什麼事情。我再次做了測試,現在一切都變得有意義了。我只是不知道沒有文本值的父標記帶有兒童標記帶/不帶文本值被認爲是空的。謝謝 – 2012-04-13 11:19:16

+0

可能發生這種情況是因爲我在文本節點之前得到了太多層次。 – 2012-04-13 11:37:19

2

我這個,這是一個更好的方式使用布爾鑄造做(bool)

$simplexml = simplexml_load_string('<a><b>test</b></a>'); 
var_dump($simplexml); //returns the actual structure 
var_dump((bool) $simplexml); // Retuns true 
var_dump((bool) $simplexml == false); //returns false 
var_dump((bool) $simplexml === false); //returns false 

演示:http://codepad.viper-7.com/xZtuNG

===比較值,並鍵入...除非對象,其中===是,如果兩個操作數獨一的真實際上是同一個對象!對於對象,==比較每個屬性的值和類型,這是===對每個其他類型所做的。

EDIT 1

參見類似https://bugs.php.net/bug.php?id=54547

+0

我的XML有太多層次,直到文本節點和父SimpleXMLElement被認爲是空的,所以轉換仍然會返回'false',導致比較返回'true'。感謝您的回答 – 2012-04-13 11:35:29

2
var_dump($simplexml == false); //returns false 

這是預期行爲,它是由數據比較經由「鬆散」的數據類型說明東西最新的錯誤。在PHP中,NULL,零和布爾FALSE被認爲是「Falsy」值;其他一切都被認爲是「Truthy」。在括號內,PHP執行表達式的評估。在這種情況下,PHP評估命名變量OBJECT和布爾FALSE的比較。它們不一樣,所以比較的返回值是FALSE,這是* var_dump()*打印的內容。

您可以在if()語句中使用這個優勢。例如:

$simplexml = SimpleXML_Load_String('<a><b>test</b></a>'); 
if ($simplexml) { /* process the object */ } 
else { /* process the failure to load the XML */ }