2016-11-18 64 views
2

我有一個被指定爲新的ArrayObject爲一個新的ArrayObject的

$var = new ArrayObject(); 

我要檢查,如果這個變量是ArrayObject型和是一個新實例化狀態的變量(相同的屬性值和結構)。一種方法好像是用的,而不是===

if ($var == new ArrayObject) { echo 'true'; } 

非嚴格評估==由於PHP瘋狂的陷阱,我不知道,如果==只是檢查,如果兩者都只是一個對象或內容。我想要一個更嚴格的檢查方式。

gettype簡單回報Object這是沒有用的。

EDITis_a()似乎正確地檢測到類型,但是如何才能檢查$ var是否處於新實例化狀態?

if (is_a($var, 'ArrayObject')) { echo 'true'; } 
+0

爲什麼你使用ArrayObject而不是o f數組? – p3tch

+0

'json_encode'稍後輸出空字典而不是數組 – myol

+1

使用is_object()函數 – RJParikh

回答

1

您可以使用該方法的ArrayObjectserialize檢查:

請看下面的代碼(http://ideone.com/Frx0EH):

$arr1 = new ArrayObject([1,2,3]); 
$arr2 = new ArrayObject(); 
$arr3 = 'HelloWorld'; 

var_dump(isInitArrayObject($arr1)); //false 
var_dump(isInitArrayObject($arr2)); //true 
var_dump(isInitArrayObject($arr3)); //false 

function isInitArrayObject($arr1) { 
    if (!($arr1 instanceof ArrayObject)) { 
     return false; 
    } else { 
     $arr_init = new ArrayObject(); 
     return ($arr1->serialize() === $arr_init->serialize()); 
    } 
} 
+0

不錯。 檢查兩個對象的類似方法是使用json_encode將ArrayObject實例轉換爲json對象,然後按字符串比較它們。 – Werner

+0

嘗試下面的代碼:'$ x = new ArrayObject();回波(序列化($ x)的 「\ n」 個。); $ x [1] = 0;回波(序列化($ x)的 「\ n」 個。);未設置($ X [1]);回波(序列化($ x)的 「\ n」 個。);'。 'unset($ x)'後,'isInitArrayObject($ x)'返回'TRUE',但是也做了一個簡單的比較:'$ x == new ArrayObject()';不需要序列化或'instanceof'。 – axiac

0

你可以這樣做:

$arr1 = new ArrayObject([1,2,3]); 
$arr2 = new ArrayObject(); 
$arr3 = 'HelloWorld'; 

var_dump((array) $arr1 == (array) new ArrayObject()); 
var_dump((array) $arr2 == (array) new ArrayObject()); 
var_dump((array) $arr3 == (array) new ArrayObject());