2011-04-25 94 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