값이 설정되고 null인지 확인


88

값이 null을 포함하여 정의되어 있는지 확인해야합니다. issetnull 값을 정의되지 않은 것으로 처리하고을 반환합니다 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)) // false를 반환합니다.이 모든 세월 동안 의자에서 떨어졌습니다 ...
max4ever

in_array ($ key, array_keys ($ _ SESSION)) && is_null ($ _ SESSION [$ key]) 너무 오랫동안 궁금해서 ..
Jack

1
이것은 나를 위해 정상적인 행동이 아닙니다. isset= is set ?, 귀하의 변수는 null로 설정됩니다. 나는 ...이 때문에 하나의 많은 시간을 낭비
빈센트 Decaux에게

답변:


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스코프에 기꺼이 대처했습니다.
salathe

1
작동하는 것 같지만 더 간단한 것을 원했습니다. 오 잘. 누군가가 하나의 라이너를 생각해 낼 수 있는지 봅시다.
Tatu Ulmanen

4
음, 변수가 필요하지 않으므로 이론적으로 한 줄 "if (array_key_exists ( 'foo', get_defined_vars ())) {}"
Hannes

fvn의 새로운 대답은 , 현재 컨텍스트에 존재하는 변수를 얻을 수있는 빠른 방법이 될 수있는 비용 피하는 의를 get_defined_vars(): array_key_exists('foo', compact('foo')). 또는 글로벌을 테스트하는 경우 : array_key_exists('foo', $GLOBALS).
ToolmakerSteve

25

당신이 개체 속성을 처리하는 경우 사용할 수있는 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를 반환합니다.


11
array_key_exists ();를 사용하여 배열에 대해 동일한 작업을 수행 할 수 있습니다.
Calum

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
인용 한 코드는 변수가 전역 범위에있는 경우에만 작동합니다.
Raveline

과연 가장 흔한 경우가 아닙니까? 함수에는 전역 범위와 인수 (항상 정의 됨)에 변수가 있습니다. 객체 속성을 가질 수도 있지만 'property_exists'를 사용할 수 있습니다.
Loïc Février

$ GLOBALS를 사용하는 것은 약간 휘발성이있는 것처럼 보이므로이 작업을 선언하기 전에 직접 테스트를 수행해야합니다.
Tatu Ulmanen

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부터 compact () 는 설정되지 않은 값에 대한 알림을 제공하므로 불행히도이 대안은 더 이상 유효하지 않습니다.

이제 compact ()는 주어진 문자열이 설정되지 않은 변수를 참조하는 경우 E_NOTICE 수준 오류를 발생시킵니다. 이전에는 이러한 문자열을 자동으로 건너 뛰었습니다.


흥미로운 대안. 그러나 $ GLOBALS와 같은 기존 배열에서 array_key_exists를 호출하는 것 보다 느릴 수 있습니다. 테이블이 커지면 해시 테이블에서 조회가 느려지지 않고 compact. 그럼에도 불구하고 나는 그것이 한 상황에서 유용하기 때문에 그것을 찬성했습니다. 어디에서 왔는지에 관계없이 현재 컨텍스트에foo 존재 하는지 알고 싶다면 -로컬인지 글로벌인지 상관하지 않으면 그것이 있는지 알고 싶습니다. 존재합니다.
ToolmakerSteve

@ToolmakerSteve-실제로 get_defined_vars. 를 참조하십시오 여기 .
nzn

1

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

}

0

isset () 대신 is_nullempty 를 사용할 수 있습니다 . Empty는 변수가 존재하지 않는 경우 오류 메시지를 인쇄하지 않습니다.


is_null을 사용하고 있습니다. 결과는 isset.
Tatu Ulmanen

내 첫 번째 답변을 게시하는 동안 실수를 저질렀습니다. empty ()로 시도 했습니까?
Raveline

1
FALSE, 0, array () 또는 ""와 같이 비어 있지 않고 NULL이 아닌 값에는 작동하지 않습니다.
Calum

1
이 대답은 틀 렸습니다. is_null다음과 같은 문제 is_set가 있습니다. OP가 가지고있는 문제인 "not set"과 "set to null"을 구별 할 수 없습니다. emptyCalum이 지적했듯이 더 나쁩니다.
ToolmakerSteve

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
매우 휴대용 보이지 않습니다 .. :)
타투 Ulmanen에게

-3

is_null($bar)값이 전혀 없기 때문에 true를 반환합니다. 또는 다음을 사용할 수 있습니다.

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

$bar이 정의 되어 있는지 확인하고 다음과 같은 경우에만 true를 반환합니다.

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

아니, 그렇게 말 if(isset($bar))할 때 거짓 있습니다 $bar = null.
Loïc Février

2
이것은 null 이외의 다른 변수를 전달하지 않습니다 (예 : if $bar = "test").
Tatu Ulmanen

3
$ bar = null이면 isset ()는 "false"를 반환하고 is_null ()은 true를 반환합니다. 거짓과 참은 항상 거짓을줍니다.
Bartek Kosa 2013

이 대답은 완전히 틀 렸습니다. 영업 이익은 말했듯이, isset($bar)거짓, 후에도 반환합니다 $bar = null;.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.