2011-04-25 9 views
6

Estoy buscando una manera elegante de probar si una variable es serializable. Por ejemplo, array(function() {}) no podrá serializar.Prueba si una variable es serializable

Actualmente estoy usando el siguiente código, pero parece ser una manera bastante no óptima de hacerlo.

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

Esa es una muy buena manera de hacerlo :) Sí – alex

+0

Estoy de acuerdo con Alex, esto se ve totalmente bien. ¿Estás preocupado con los gastos generales que intentan serializar? –

+0

Creo que es la mejor manera, y de otra manera no existe :) –

Respuesta

6

La alternativa podría ser:

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; 
} 

Pero a partir de los comentarios creo que esto es lo que busca:

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

Esto echa de menos un cheque por ser un recurso. – shokora

0

respuesta tardía pero ...

According to PHP documentation , los vars del tipo de Recurso no pueden ser serializados. Sin embargo, al menos en PHP 5.4, intentar serializar un Recurso no desencadenará ningún error.

creo que un mejor enfoque sería probar para cierres y recursos sin 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)); 

Salidas:

boolean false 
boolean false 
boolean true 
+0

No tengo idea de por qué alguien -1 esto ... pero de todos modos. También debe comprobar si se trata de un 'objeto', y si es así, si implementa' Serializable'. – Geoffrey

+0

Esto falla si '$ var' es una matriz que contiene valores no serializables. –

Cuestiones relacionadas