2010-09-27 16 views
65

मुझे यह जांचने की आवश्यकता है कि मूल्य को शून्य के रूप में परिभाषित किया गया है या नहीं। isset शून्य मानों को अपरिभाषित मानता है और false देता है। एक उदाहरण के रूप समझें:जांचें कि क्या मान जारी है और शून्य

$foo = null; 

if(isset($foo)) // returns false 
if(isset($bar)) // returns false 
if(isset($foo) || is_null($foo)) // returns true 
if(isset($bar) || is_null($bar)) // returns true, raises a notice 

ध्यान दें कि $bar अपरिभाषित है।

if(something($bar)) // returns false; 
if(something($foo)) // returns true; 

कोई भी विचार:

मैं एक शर्त है कि निम्नलिखित को संतुष्ट करता है खोजने की जरूरत है?

+14

अगर (isset ($ foo)) // झूठी देता है, मैं कुर्सी, इन सभी वर्षों ... – max4ever

उत्तर

63

IIRC, तो आप इस के लिए get_defined_vars() उपयोग कर सकते हैं:

$foo = NULL; 
$vars = get_defined_vars(); 
if (array_key_exists('bar', $vars)) {}; // Should evaluate to FALSE 
if (array_key_exists('foo', $vars)) {}; // Should evaluate to TRUE 
+0

+1 मैं एक ही फ़ंक्शन का सुझाव देने जा रहा था, 'get_defined_vars' खुशी से गुंजाइश के साथ copes। – salathe

+1

काम करने लगता है, लेकिन मैं कुछ आसान की उम्मीद कर रहा था। ओह अच्छा। चलो देखते हैं कि कोई भी एक लाइनर के साथ आ सकता है। –

+4

अच्छी तरह से, आपको वर्रों की आवश्यकता नहीं है, इसलिए सिद्धांत में इसकी एक पंक्ति "अगर (array_key_exists ('foo', get_defined_vars())) {}" – Hannes

0

आप जारी करने के बजाय is_null और empty का उपयोग कर सकते हैं। यदि चर मौजूद नहीं है तो खाली एक त्रुटि संदेश मुद्रित नहीं करता है।

+0

मैं is_null उपयोग कर रहा हूँ से गिर गया। परिणाम 'जारीकर्ता' के बावजूद समान है। –

+0

मैंने अपना पहला जवाब पोस्ट करते समय गलती की: क्या आपने खाली() के साथ प्रयास किया? – Raveline

+0

यह उन मानों के लिए काम नहीं करेगा जो खाली नहीं हैं और न कि FALSE, 0, array() या "" जैसे। – C9HDN

12

, Best way to test for a variable's existence in PHP; isset() is clearly broken

if(array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true 
if(array_key_exists('bar', $GLOBALS) && is_null($bar)) // false & => false 
+3

आपके द्वारा उद्धृत कोड केवल तभी काम करता है जब चर वैश्विक स्तर पर है। – Raveline

+0

दरअसल लेकिन क्या यह सबसे लगातार मामला नहीं है? एक फ़ंक्शन में आपके पास वैश्विक दायरे और तर्क (जो हमेशा परिभाषित होते हैं) पर चर होंगे। आप ऑब्जेक्ट गुण भी प्राप्त कर सकते हैं लेकिन फिर आप 'property_exists' का उपयोग कर सकते हैं। –

+0

$ ग्लोबल का उपयोग करना थोड़ा अस्थिर लगता है, मुझे इसे कुछ परीक्षण करना पड़ता है इससे पहले कि मैं इसे काम के रूप में घोषित कर सकूं। –

-2

is_null($bar) रिटर्न सच देखें, क्योंकि इसमें कोई मान बिल्कुल नहीं है। वैकल्पिक रूप से, आप का उपयोग कर सकते हैं:

if(isset($bar) && is_null($bar)) // returns false 

अगर $bar परिभाषित किया गया है की जाँच करने के लिए और केवल सच लौट यदि देगा:

$bar = null; 
if(isset($bar) && is_null($bar)) // returns true 
+0

नहीं, उन्होंने कहा कि 'if (isset ($ bar))' $ bar = null' होने पर झूठी देता है। –

+0

मेरा बुरा। मेरा जवाब अपडेट करेगा। – Ruel

+2

यह शून्य से किसी अन्य चर को पारित नहीं करेगा (उदाहरण के लिए यदि '$ bar =" test "')। –

0

यहाँ कुछ मूर्खतापूर्ण तरीके को xdebug का उपयोग कर। ;-)

function is_declared($name) { 
    ob_start(); 
    xdebug_debug_zval($name); 
    $content = ob_get_clean(); 

    return !empty($content); 
} 

$foo = null; 
var_dump(is_declared('foo')); // -> true 

$bla = 'bla'; 
var_dump(is_declared('bla')); // -> true 

var_dump(is_declared('bar')); // -> false 
+1

बहुत पोर्टेबल नहीं दिखता .. :) –

+1

दरअसल। और प्रदर्शन भी गिर सकता है। ;-) –

1

निम्नलिखित कोड PHP एक्सटेंशन के रूप में लिखा array_key_exists ($ नाम, get_defined_vars()) के बराबर है (हेनरिक और करने के लिए धन्यवाद हेंस)।

// get_defined_vars() 
// https://github.com/php/php-src/blob/master/Zend/zend_builtin_functions.c#L1777 
// array_key_exists 
// https://github.com/php/php-src/blob/master/ext/standard/array.c#L4393 

PHP_FUNCTION(is_defined_var) 
{ 

    char *name; 
    int name_len; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { 
     return; 
    } 

    if (!EG(active_symbol_table)) { 
     zend_rebuild_symbol_table(TSRMLS_C); 
    } 

    if (zend_symtable_exists(EG(active_symbol_table), name, name_len + 1)) { 
     RETURN_TRUE; 
    } 

} 
21

आप वस्तु गुण whcih शून्य का एक मूल्य हो सकता है के साथ काम कर रहे हैं, तो आप उपयोग कर सकते हैं: isset()

<?php 

class myClass { 
    public $mine; 
    private $xpto; 
    static protected $test; 

    function test() { 
     var_dump(property_exists($this, 'xpto')); //true 
    } 
} 

var_dump(property_exists('myClass', 'mine')); //true 
var_dump(property_exists(new myClass, 'mine')); //true 
var_dump(property_exists('myClass', 'xpto')); //true, as of PHP 5.3.0 
var_dump(property_exists('myClass', 'bar')); //false 
var_dump(property_exists('myClass', 'test')); //true, as of PHP 5.3.0 
myClass::test(); 

?> 

isset (साथ विपरीत) के बजाय property_exists(), property_exists() सही रिटर्न भले ही संपत्ति का मूल्य न्यूल हो।

+7

आप array_key_exists() के साथ सरणी के लिए भी ऐसा ही कर सकते हैं; – C9HDN

2

मैं ने पाया है कि compact एक समारोह है कि सेट नहीं चर पर ध्यान नहीं देता लेकिन null करने के लिए सेट लोगों पर कार्रवाई करता है, इसलिए मैं कल्पना कर सकते हैं आप एक बड़े स्थानीय प्रतीक तालिका जब आप द्वारा array_key_exists('foo', get_defined_vars()) जाँच पर एक अधिक कुशल समाधान प्राप्त कर सकते हैं array_key_exists('foo', compact('foo')) का उपयोग कर:

$foo = null; 
echo isset($foo) ? 'true' : 'false'; // false 
echo array_key_exists('foo', compact('foo')) ? 'true' : 'false'; // true 
echo isset($bar) ? 'true' : 'false'; // false 
echo array_key_exists('bar', compact('bar')) ? 'true' : 'false'; // false 
+0

दिलचस्प विकल्प। लेकिन ध्यान दें कि यह मौजूदा सरणी पर सरणी_की_एक्सिस्ट्स को कॉल करने की तुलना में धीमा * है, जैसे कि $ ग्लोबल्स - क्योंकि हैश टेबल में एक लुक अप नहीं होता है, जब टेबल बड़ा हो जाता है, और आपने अतिरिक्त काम जोड़ा है 'कॉम्पैक्ट 'का। फिर भी, मैंने इसे उखाड़ फेंक दिया क्योंकि यह एक परिस्थिति में उपयोगी है: यदि आप जानना चाहते हैं कि वर्तमान संदर्भ में 'foo' मौजूद है *, चाहे वह कहां से आया हो - यदि आपको परवाह नहीं है कि स्थानीय या वैश्विक है, तो बस जानना चाहते हैं कि यह मौजूद है या नहीं। – ToolmakerSteve

+0

@ToolmakerSteve - मैं वास्तव में 'get_defined_vars' को कॉल करने के संभावित महत्वपूर्ण ओवरहेड का जिक्र कर रहा था। [यहां] देखें (http://stackoverflow.com/questions/27808704/what-is-the-performance-impact-off-get-defined-vars)। – nzn

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