মান ইসেট এবং নাল কিনা তা পরীক্ষা করুন


90

নাল সহ মানটিকে কোনও হিসাবে সংজ্ঞায়িত করা হয়েছে কিনা তা আমাকে পরীক্ষা করতে হবে। 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;

কোন ধারনা?


20
যদি (isset ($ foo)) // মিথ্যা প্রত্যাবর্তন করে, আমি
এত

in_array ($ কী, অ্যারে_কিজ ($ _ অধিবেশন)) && is_null (S _ সেশন [$ কী]) আমি এতক্ষণ ধরে ভাবছিলাম ..
জ্যাক

4
এটি আমার পক্ষে স্বাভাবিক আচরণ নয়, isset= সেট করা আছে ?, আপনার ভেরিয়েবলটি নালায় সেট করা আছে। আমি
এটির

উত্তর:


85

আইআইআরসি, আপনি এটির 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আনন্দের সাথে সুযোগের সাথে কপি করব।
সালাতে

4
কাজ করছে বলে মনে হচ্ছে, তবে আমি আরও সহজ কিছু আশা করছিলাম। আচ্ছা ভালো. দেখা যাক যে কেউ ওয়ান লাইনার নিয়ে আসতে পারে কিনা।
তাতু উলমানেন

4
ভাল, আপনি প্রয়োজন নেই Vars, তত্ত্ব তা করতে তার এক লাইন "যদি (array_key_exists ( 'foo বিন্যাস', get_defined_vars ())) {}"
Hannes

fvn এর নতুন উত্তর একটি পরিবর্তনশীল বর্তমান প্রেক্ষাপটে বিদ্যমান, পেতে একটি দ্রুততর উপায় হতে পারে খরচ এড়ানো এর get_defined_vars(): array_key_exists('foo', compact('foo'))। অথবা দ্রুততর, যদি একটি বিশ্বব্যাপী টেস্টিং: array_key_exists('foo', $GLOBALS)
টুলমেকারস্টেভ

25

আপনি যদি অবজেক্ট প্রোপার্টি নিয়ে কাজ করছেন তবে যার মূল্য নুল হতে পারে আপনি ব্যবহার করতে পারেন: 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();

?>

আইসেট () এর বিপরীতে, সম্পত্তি_exists () সম্পত্তির মান NULL থাকলেও সত্য প্রদান করে returns


11
আপনি অ্যারে_কি_এক্সিস্টগুলি () দিয়ে অ্যারেগুলির জন্যও একই কাজ করতে পারেন;
চাচ

14

দেখুন পিএইচপি একটি পরিবর্তনশীল এর অস্তিত্বের পরীক্ষা শ্রেষ্ঠ উপায়; isset () স্পষ্টভাবে নষ্ট হয়ে গেছে

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

4
আপনি যে কোডটি উদ্ধৃত করেছেন তা কেবল তখনই কার্যকর হয় যদি পরিবর্তনশীল বিশ্বব্যাপী সুযোগে থাকে।
রাভলাইন

প্রকৃতপক্ষে তবে এটি সবচেয়ে ঘন ঘন কেস নয়? কোনও ফাংশনে আপনার বৈশ্বিক সুযোগ এবং আর্গুমেন্টে ভেরিয়েবল থাকবে (যা সর্বদা সংজ্ঞায়িত হয়)। আপনার অবজেক্টের বৈশিষ্ট্যও থাকতে পারে তবে আপনি 'সম্পত্তি_exists' ব্যবহার করতে পারেন।
ফ্যাভিয়ার

LO গ্লোবালগুলি ব্যবহার করা কিছুটা অস্থির বলে মনে হচ্ছে, এটিকে কাজ হিসাবে ঘোষণা করার আগে আমাকে কিছু পরীক্ষা করতে হবে।
তাতু উলমানেন

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

হালনাগাদ

পিএইচপি হিসাবে 7.3 কমপ্যাক্ট () আনসেট মানগুলির জন্য একটি বিজ্ঞপ্তি দেবে, সুতরাং দুর্ভাগ্যক্রমে এই বিকল্পটি আর কার্যকর হবে না।

কমপ্যাক্ট () এখন একটি E_NOTICE স্তর ত্রুটি জারি করে যদি একটি প্রদত্ত স্ট্রিংটি সেট না করে থাকা ভেরিয়েবলটিকে বোঝায়। পূর্বে, এই ধরনের স্ট্রিং নিঃশব্দে এড়ানো হয়েছে।


আকর্ষণীয় বিকল্প। কিন্তু মনে রাখবেন যে সম্ভবত ধীর যেমন $ GLOBALS যেমন একটি বিদ্যমান শৃঙ্খলার array_key_exists, কলিং চেয়ে - কারণ একটি হ্যাশ টেবিল একবার দেখে যেকোনো ধীর পাবেন না, যখন টেবিল বৃহৎ পায়, এবং আপনার অতিরিক্ত কাজ জুড়েছেন compact। তবুও, আমি এটিকে উত্সাহিত করেছি কারণ এটি একটি পরিস্থিতিতে কার্যকর: আপনি যদি বর্তমান প্রসঙ্গেfoo উপস্থিত হন কিনা তা জানতে চান , কোথা থেকে এসেছে তা নির্বিশেষে - যদি আপনি স্থানীয় বা বিশ্বব্যাপী কিনা তা যদি যত্ন না করেন তবে কেবল এটি জানতে চান বিদ্যমান
টুলমেকারস্টেভ

@ টুলমেকারস্টেভ - আমি আসলে কল করার সম্ভাব্য উল্লেখযোগ্য ওভারহেডের কথা উল্লেখ করছি get_defined_varsএখানে দেখুন ।
এনজিএন

1

পিএইচপি এক্সটেনশান হিসাবে লিখিত নিম্নলিখিত কোডটি অ্যারে_কি_এক্সিস্টগুলির ($ নাম, 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
তাতু উলমানেন

আমার প্রথম উত্তর পোস্ট করার সময় আমি একটি ভুল করেছি: আপনি কি খালি () দিয়ে চেষ্টা করেছেন?
রাভলাইন

4
এটি খালি নয় এবং নাল যেমন FALSE, 0, অ্যারে () বা "" এর জন্য কাজ করবে না।
চাচ

4
এই উত্তরটি ভুল। 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

4
খুব পোর্টেবল
লাগে

-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
ফ্যাভিয়ার

4
এটি নাল (যেমন, যদি $bar = "test") ব্যতীত অন্য কোনও ভেরিয়েবল পাস করবে না ।
তাতু উলমানেন

4
যখন $ বার = নাল ইসেট () "মিথ্যা" এবং ইস_নুল () সত্য ফিরে আসবে। মিথ্যা এবং সত্য সর্বদা মিথ্যা দেয়।
বারটেক কোসা

এই উত্তর সম্পূর্ণ ভুল। ওপি যেমন বলেছে, isset($bar)মিথ্যাও ফিরে আসে, তার পরেও $bar = null;
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.