2011-04-25 90 views
6

如果變量是可序列化的,我正在尋找一種優雅的測試方法。例如array(function() {})將無法​​序列化。測試變量是否可序列化

我目前使用下面的代碼,但它似乎是一個非常不理想的方式。

function isSerializable($var) 
{ 
    try { 
     serialize($var); 
     return TRUE; 
    } catch(Exception $e) { 
     return FALSE; 
    } 
} 

var_dump(isSerializable(array()));    // bool(true) 
var_dump(isSerializable(function() {}));   // bool(false) 
var_dump(isSerializable(array(function() {}))); // bool(false) 
+1

這是做:) – alex 2011-04-25 04:22:35

+0

的一個很好的辦法呀我同意亞歷克斯,這看起來非常好。你是否擔心試圖序列化的開銷? – 2011-04-25 04:23:58

+0

我認爲這是最好的方式,而其他方式不存在:) – 2011-04-25 04:24:33

回答

6

另一種選擇可能是:

function isSerializable ($value) { 
    $return = true; 
    $arr = array($value); 

    array_walk_recursive($arr, function ($element) use (&$return) { 
    if (is_object($element) && get_class($element) == 'Closure') { 
     $return = false; 
    } 
    }); 

    return $return; 
} 

但是從意見我認爲這是你在找什麼:

function mySerialize ($value) { 
    $arr = array($value); 

    array_walk_recursive($arr, function (&$element) { 

    # do some special stuff (serialize closure) ... 
    if (is_object($element) && get_class($element) == 'Closure') { 
     $serializableClosure = new SerializableClosure($element); 
     $element = $serializableClosure->serialize(); 
    } 

    }); 

    return serialize($arr[0]); 
} 
+0

這沒有檢查它是一個資源。 – shokora 2016-09-20 16:16:00

0

晚的答案,但...

According to PHP documentation ,資源類型的變量不能被序列化。 但是,至少在PHP 5.4中,嘗試序列化資源不會觸發任何錯誤。

我認爲更好的辦法是,以測試關閉和資源,而try/catch語句:

$resource = fopen('composer.json', 'r'); 
$closure = function() { 
    return 'bla'; 
}; 
$string = 'string'; 

function isSerializable($var) 
{ 
    if (is_resource($var)) { 
     return false; 
    } else if ($var instanceof Closure) { 
     return false; 
    } else { 
     return true; 
    } 
} 

var_dump(isSerializable($resource)); 
var_dump(isSerializable($closure)); 
var_dump(isSerializable($string)); 

輸出:

boolean false 
boolean false 
boolean true 
+0

不知道爲什麼有人-1這個...但無論如何。 你還應該檢查它是否是一個'object',如果是的話,它是否實現了'Serializable'。 – Geoffrey 2016-04-21 05:28:39

+0

如果'$ var'是一個包含不可序列化的值的數組,則會失敗。 – 2017-01-02 16:36:50