php
2016-02-26 61 views 3 likes 
3

我正在做一個會從遠程服務器拉一個XML文件,並在成功獲取它會返回我SimpleXMLElement對象或返回false的功能如果它是不能夠得到的信息讓說由於網絡故障。比較操作行爲不端就在幾天前

一種常見又懶惰的做法是檢查檢查使用,以確保如果有什麼東西在變函數的響應。下面 可能的代碼會試圖更好地解釋什麼,我想說

<?php 


$xmlString = "<?xml version='1.0' standalone='yes'?><root><node>A</node></root>"; 
$xmlElement = new SimpleXMLElement($xmlString); 

var_dump($xmlElement); 
//Shows an xml element that is not empty 

var_dump((bool)$xmlElement); 
//Returns true 

if($xmlElement) 
{ 
    //Executions comes inside 
    echo "i`m true"; 
} 


var_dump($xmlElement == false); 
//Strangely this is also true 


?> 

有人能解釋爲什麼比較操作的結果是布爾(真)

+2

我不認爲它是重複的,元素不是空的。更奇怪的是,將元素轉換爲布爾值會導致'true':https://eval.in/526013 – jeroen

+0

你是對的@ jeroen ..奇怪的行爲.. –

+0

其實我試過var_dump((bool)$ xmlElement == false )和它的作品... –

回答

0
var_dump($xmlElement == false) 

我們比較$ xmlElement和值False。所以如果$ xmlElement是False,比較將是True(false == false)。 PHP需要將$ xmlElement轉換爲布爾值。

PHP DOC爲布爾值: http://php.net/manual/en/language.types.boolean.php

當轉換爲布爾值,下面的值被認爲是FALSE:

  • 布爾值FALSE
  • 整數0(零)
  • 浮子0.0(零)
  • 空字符串,字符串「0」
  • 用零個元素
  • 零個成員變量的對象的陣列(PHP 4只)
  • 特殊類型NULL(包括尚未設定的變量)從空標籤
創建
  • 的SimpleXML對象
  • +0

    不是我的DV,但你需要使用英語 –

    +0

    是的,對不起... –

    +1

    你應該嘗試'var_dump((bool)$ xmlElement);'只是爲了好玩:-) – jeroen

    0

    我做了一些研究(http://php.net/manual/en/class.simplexmlelement.php)。

    這句話是第一個註釋:

    至前進一步的評論和驅動點回家:

    是什麼讓的SimpleXMLElement棘手一起工作的是感覺和>行爲像一個對象,但實際上是一個系統RESOURCE,(特別是一個> libxml資源)。

    這就是爲什麼你不能存儲一個SimpleXMLElement到$ _SESSION或執行>節點值直接比較操作,而第一投射他們>某些類型的對象。 $ _SESSION期望存儲「對象」和「比較」運算符期望比較2個「對象」,並且SimpleXMLElements不是>對象。

    當您回聲或打印節點的值,PHP價值(資源)>轉換成你的String對象。這確實節省了時間,但是可以欺騙你>認爲你的SimpleXMLElement是一個對象。

    希望這有助於澄清

    因此很明顯,你的對象是一個的ressource。我的猜測是這是一個PHP bug ...

    var_dump((bool) $xmlElement) => bool(True) 
    var_dump($xmlElement == false) => bool(True) //No reason 
    var_dump((bool) $xmlElement == false) => bool(False) //Why is behavior different ? 
    
    +0

    所以你說如果在我們的例子中不是空var_dump((bool)$ xmlElement)=> bool(True),但是在此語句中var_dump($ xmlElement == false)時,將類型資源轉換爲布爾值會給我們提供true,當它試圖做同樣的事情時轉換爲假? – Ashar

    +0

    我的猜測是$ xmlElement的隱式轉換沒有正確完成,也許是因爲它不是一個真實的對象,而是一個資源... –

    相關問題