जाँच करें कि क्या मूल्य अशांत और अशक्त है


88

मुझे यह जांचने की आवश्यकता है कि क्या मान किसी भी चीज के रूप में परिभाषित है, जिसमें अशक्त भी शामिल है। 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;

कोई विचार?


19
if (isset ($ foo)) // झूठा लौटता है, मैं कुर्सी से गिर गया, इन सभी वर्षों ...
अधिकतम 4

in_array ($ कुंजी, array_keys ($ _ सत्र)) && is_null ($ _ सत्र [$ कुंजी]) मैं इतने लंबे समय से सोच रहा था ..
जैक

1
यह मेरे लिए एक सामान्य व्यवहार नहीं है, isset= सेट है ?, आपका चर शून्य पर सेट है। मैंने इस वजह से बहुत समय बर्बाद किया ...
विन्सेन्ट डेक्सक्स

जवाबों:


84

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

+1 मैं उसी फ़ंक्शन का सुझाव देने जा रहा था, जो get_defined_varsखुशी से गुंजाइश के साथ मुकाबला करता है।
सलातो

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

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

fvn के नए जवाब एक चर कि वर्तमान संदर्भ में मौजूद है, पाने के लिए एक तेज तरीका हो सकता है लागत से बचने के get_defined_vars(): array_key_exists('foo', compact('foo'))। या तेजी से, अगर एक वैश्विक परीक्षण array_key_exists('foo', $GLOBALS):।
टूलमेकरसैट

25

यदि आप वस्तु गुणों से निपट रहे हैं, तो आपके पास NULL का एक मूल्य हो सकता है जिसका आप उपयोग कर सकते हैं: के property_exists()बजाय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 () TRUE लौटाता है भले ही संपत्ति का मान NULL हो।


11
आप array_key_exists () के साथ सरणियों के लिए भी ऐसा कर सकते हैं;
कलुम

14

PHP में एक चर के अस्तित्व के लिए परीक्षण करने का सबसे अच्छा तरीका देखें ; isset () स्पष्ट रूप से टूट गया है

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

3
आपके द्वारा बोली जाने वाला कोड केवल तभी काम करता है जब वैरिएबल स्कोप में हो।
रवेलिन

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

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

4

मैंने पाया है कि 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

अपडेट करें

PHP के रूप में 7.3 कॉम्पैक्ट () असंगत मूल्यों के लिए एक नोटिस देगा, इसलिए दुर्भाग्य से यह विकल्प अब मान्य नहीं है।

कॉम्पैक्ट () अब एक E_NOTICE स्तर की त्रुटि जारी करता है यदि किसी दिए गए स्ट्रिंग को एक परेशान चर को संदर्भित करता है। पूर्व में, इस तरह के तारों को चुपचाप छोड़ दिया गया है।


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

@ToolmakerSteve - मैं वास्तव में कॉलिंग के संभावित महत्वपूर्ण ओवरहेड का उल्लेख कर रहा था get_defined_vars। देखें यहाँ
nnn

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

}

0

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


मैं is_null का उपयोग कर रहा हूं। परिणाम की परवाह किए बिना एक ही है isset
ततुल उलेमेन

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

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

1
यह उत्तर गलत है। is_nullके रूप में एक ही समस्या है is_set: यह "नहीं सेट" और "शून्य करने के लिए सेट" के बीच अंतर नहीं कर सकता है, जो कि ओपी की समस्या है। emptyइससे भी बदतर है, जैसा कि कैलम बताते हैं।
टूलमेकरसैट

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
बहुत पोर्टेबल नहीं लगता है .. :)
Tatu Ulmanen 12

-3

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

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

$barयह परिभाषित करने के लिए कि क्या परिभाषित किया गया है और केवल तभी वापस आएगा यदि:

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

नहीं, उन्होंने कहा कि if(isset($bar))झूठ कब देता है $bar = null
Loïc Février

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

3
जब $ बार = अशक्त इस्सेट () "गलत" लौटेगा और is_null () सही लौटेगा। असत्य और सत्य हमेशा असत्य देता है।
बार्टेक कोसा

यह जवाब पूरी तरह से गलत है। जैसा कि ओपी ने कहा है, isset($bar)झूठे रिटर्न के बाद भी $bar = null;
टूलमेकरसैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.