[php] 값이 설정되고 null인지 확인
값이 null을 포함하여 정의되어 있는지 확인해야합니다. isset
null 값을 정의되지 않은 것으로 처리하고을 반환합니다 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;
어떤 아이디어?
답변
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
답변
당신이 개체 속성을 처리하는 경우 사용할 수있는 NULL의 값을 가질 수 whcih : 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 ()는 속성 값이 NULL 인 경우에도 TRUE를 반환합니다.
답변
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
답변
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부터 compact () 는 설정되지 않은 값에 대한 알림을 제공하므로 불행히도이 대안은 더 이상 유효하지 않습니다.
이제 compact ()는 주어진 문자열이 설정되지 않은 변수를 참조하는 경우 E_NOTICE 수준 오류를 발생시킵니다. 이전에는 이러한 문자열을 자동으로 건너 뛰었습니다.
답변
PHP 확장으로 작성된 다음 코드는 array_key_exists ($ name, get_defined_vars ()) (Henrik 및 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;
}
}
답변
답변
여기 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