2011-04-25 12 views
6

यदि कोई चर क्रमबद्ध है तो मैं परीक्षण का एक शानदार तरीका ढूंढ रहा हूं। उदाहरण के लिए array(function() {}) क्रमबद्ध करने में विफल रहेगा।परीक्षण करें यदि एक चर है serializable

मैं वर्तमान में नीचे दिए गए कोड का उपयोग कर रहा हूं, लेकिन ऐसा करने का यह एक गैर-इष्टतम तरीका प्रतीत होता है।

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

+0

करने का एक बहुत अच्छा तरीका है कि हाँ मैं एलेक्स से सहमत हूं, यह बिल्कुल ठीक दिखता है। क्या आप धारावाहिक करने की कोशिश कर रहे ओवरहेड से चिंतित हैं? –

+0

मुझे लगता है कि यह सबसे अच्छा तरीका है, और अन्य तरीका मौजूद नहीं है :) –

उत्तर

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

0

देर जवाब लेकिन ...

According to PHP documentation , संसाधन प्रकार के युद्धों को क्रमबद्ध नहीं किया जा सकता है। हालांकि, कम से कम PHP 5.4 में, किसी संसाधन को क्रमबद्ध करने का प्रयास करने से कोई त्रुटि नहीं आती है।

मुझे लगता है कि एक बेहतर दृष्टिकोण बंद और संसाधनों ट्राई/कैच के बिना के लिए परीक्षण करने के लिए किया जाएगा:

$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 यह ... लेकिन वैसे भी। आपको यह भी जांचना चाहिए कि यह 'ऑब्जेक्ट' है, और यदि ऐसा है, तो यह 'Serializable' लागू करता है। – Geoffrey

+0

यह विफल रहता है यदि '$ var' एक सरणी है जिसमें गैर क्रमिक मान शामिल हैं। –

संबंधित मुद्दे