Saya perlu memeriksa apakah nilai didefinisikan sebagai apa pun, termasuk nol. isset
memperlakukan nilai null sebagai tidak terdefinisi dan mengembalikan false
. Ambil contoh berikut ini:
$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
Perhatikan bahwa $bar
tidak ditentukan.
Saya perlu menemukan kondisi yang memenuhi berikut ini:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
Ada ide?
isset
= disetel?, Variabel Anda disetel ke nol. Saya membuang banyak waktu karena yang satu ini ...Jawaban:
IIRC, Anda dapat menggunakan
get_defined_vars()
untuk ini:$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
sumber
get_defined_vars
dengan senang hati mengatasi ruang lingkup.get_defined_vars()
:array_key_exists('foo', compact('foo'))
. Atau lebih cepat, jika pengujian global:array_key_exists('foo', $GLOBALS)
.Jika Anda berurusan dengan properti objek yang mungkin memiliki nilai NULL, Anda dapat menggunakan:
property_exists()
sebagai gantiisset()
<?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(); ?>
sumber
Lihat Cara terbaik untuk menguji keberadaan variabel di PHP; isset () jelas rusak
if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false & => false
sumber
Saya telah menemukan itu
compact
adalah fungsi yang mengabaikan variabel yang tidak disetel tetapi berfungsi pada variabel yang disetelnull
, jadi ketika Anda memiliki tabel simbol lokal yang besar, saya akan membayangkan Anda bisa mendapatkan solusi yang lebih efisien daripada memeriksaarray_key_exists('foo', get_defined_vars())
dengan menggunakanarray_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
Memperbarui
Mulai PHP 7.3, compact () akan memberikan pemberitahuan untuk nilai yang tidak disetel, jadi sayangnya alternatif ini tidak lagi valid.
sumber
compact
. Namun demikian, saya memberi suara positif karena berguna dalam satu situasi: jika Anda ingin tahu apakahfoo
ada dalam konteks saat ini , terlepas dari mana asalnya - jika Anda tidak peduli apakah itu lokal atau global, hanya ingin tahu apakah itu ada.get_defined_vars
. Lihat disini .Kode berikut yang ditulis sebagai ekstensi PHP setara dengan array_key_exists ($ name, get_defined_vars ()) (terima kasih kepada Henrik dan Hannes).
// 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; } }
sumber
Anda bisa menggunakan is_null dan empty sebagai ganti isset (). Empty tidak mencetak pesan kesalahan jika variabel tidak ada.
sumber
isset
.is_null
memiliki masalah yang sama sepertiis_set
: ia tidak dapat membedakan antara "not set" dan "set to null", yang merupakan masalah yang dimiliki OP.empty
bahkan lebih buruk, seperti yang ditunjukkan Calum.Berikut beberapa solusi konyol menggunakan 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
sumber
is_null($bar)
mengembalikan nilai true, karena tidak memiliki nilai sama sekali. Alternatifnya, Anda dapat menggunakan:if(isset($bar) && is_null($bar)) // returns false
untuk memeriksa apakah
$bar
sudah ditentukan dan hanya akan mengembalikan nilai true jika:$bar = null; if(isset($bar) && is_null($bar)) // returns true
sumber
if(isset($bar))
memberikan false saat$bar = null
.$bar = "test"
).isset($bar)
mengembalikan false, bahkan setelahnya$bar = null;
.