PHP에서 변수의 존재를 테스트하는 가장 좋은 방법; isset ()이 명확하게 깨졌습니다.


187

로부터 isset()문서 :

isset() will return FALSE if testing a variable that has been set to NULL.

기본적으로 isset()변수가 설정되어 있는지 확인하지 않고 변수가 아닌 다른 것으로 설정되어 있는지 확인합니다 NULL.

그렇다면 실제로 변수가 있는지 확인하는 가장 좋은 방법은 무엇입니까? 나는 다음과 같은 것을 시도했다 :

if(isset($v) || @is_null($v))

( 설정되지 않은 @경우 경고를 피해야 함 $v) is_null()와 비슷한 문제가 있습니다 isset(). TRUE설정되지 않은 변수를 반환 합니다! 또한 다음과 같이 나타납니다.

@($v === NULL)

정확히 똑같이 작동 @is_null($v)하므로 나옵니다.

PHP에서 변수가 있는지 어떻게 안정적으로 확인해야합니까?


편집 : 설정되지 않은 변수와 설정 된 변수 사이에 PHP의 차이점이 분명히 있습니다 NULL.

<?php
$a = array('b' => NULL);
var_dump($a);

PHP는 $a['b']존재하고 NULL가치 가 있음을 보여줍니다 . 추가하면 :

var_dump(isset($a['b']));
var_dump(isset($a['c']));

isset()함수 에 대해 이야기하고있는 모호성을 볼 수 있습니다 . 다음은이 세 가지의 결과입니다 var_dump()s.

array(1) {
  ["b"]=>
  NULL
}
bool(false)
bool(false)

추가 편집 : 두 가지.

하나는 유스 케이스입니다. UPDATE배열의 키는 테이블의 열이고 배열의 값은 각 열에 적용되는 값인 SQL 문의 데이터로 변환 됩니다. 테이블의 열은 배열에 값 NULL을 전달하여 표시되는 값을 보유 할 수 있습니다 NULL. 존재하지 않는 배열 키와 배열 값을 구분하는 방법 이 필요 합니다 NULL. 그것은 열의 값을 업데이트하지 않는 것과 열의 값을로 업데이트하는 것의 차이점 NULL입니다.

둘째, Zoredache의 대답은 , array_key_exists()내 위의 사용 사례과 전역 변수, 제대로 작동 :

<?php
$a = NULL;
var_dump(array_key_exists('a', $GLOBALS));
var_dump(array_key_exists('b', $GLOBALS));

출력 :

bool(true)
bool(false)

즉 제대로 거의 모든 곳에서 처리하기 때문에 내가 존재로 설정되는 변수하지 않는 변수 사이의 모호함이되는 것을 볼 수 있습니다 NULL, 내가 전화 한 array_key_exists()PHP의 공식 가장 쉬운 방법은 진정으로 변수의 존재를 확인하기 위해이 .

(내가 생각할 수있는 유일한 경우는 거기에있는 클래스의 속성입니다 property_exists()에 따라, 그 문서 , 비슷하게 작동 array_key_exists()이 제대로 설정되는과에 세트가없는 사이에 구별 점에서 NULL.)


확인할 수는 없지만 왜해야합니까?
너무 많은 PHP

12
NULL은 PHP에서 매우 특정한 의미를 지니고 있으며 변수 설정 여부와는 완전히 별개의 개념입니다.
chazomaticus

33
null과 존재하지 않는 것을 구별해야 할 이유 가 있습니다 . 예를 들어 데이터베이스 테이블의 행을 나타내는 개체를 작성하고 있습니다. 행의 모든 ​​열에 대해 객체의 getter 메서드를 통해서만 액세스 할 수있는 전용 변수를 만듭니다. 열 값이 널이라고 가정하십시오. 이제 getter 메소드는 테이블에 그러한 열이 없는지 또는이 객체에 null 값이 있는지 어떻게 알 수 있습니까? 다행히도, 개인 변수는 실제로 개인 배열의 항목이므로 array_key_exists를 사용할 수 있지만 이것은 실제 문제입니다.
Nathan Long

1
새로운 버전의 PHP에서 제거되었습니다. 불행히도 모든 PHP 배포에서 나온 것은 아닙니다. 또한 배열 요소 또는 변수에 대해 이야기하고 있는지에 대한 간단한 의미 론적 세부 사항처럼 보입니다. 코드가 준수해야 할 표준에 관계없이 PHP 언어의 불일치를 해결하는 방법을 아는 것이 유용합니다.
chazomaticus

2
@chazomaticus 그러나 변수와 배열 요소 는 근본적으로 다릅니다 . 그들과 똑같은 일을 할 수 있다고해서 100 % 상호 교환 가능해야한다는 의미는 아닙니다. 여기에 "PHP 언어의 불일치"가 없으며 좋아하거나 이해하지 못하는 것입니다. 에 관해서는 register_globals, 나는 여전히 HTTP 요청에서 등록 된 것이 항상 문자열이 아니기 때문에 그러한 구별이 필요한 상황을 생각하기 위해 고심하고 있습니다 null.
IMSoP

답변:


97

확인중인 변수가 전역 범위에 있으면 다음을 수행 할 수 있습니다.

array_key_exists('v', $GLOBALS) 

3
아하! 지금 당신은 말하는거야! 예를 들어 클래스 속성에 대해 어떻게 하시겠습니까?
chazomaticus

22
변형으로, 검사가 로컬 범위 변수에 대해서도 작동 해야하는 경우 on을 $defined_vars = get_defined_vars();통해 테스트 할 수 있습니다 array_key_exists('v', $defined_vars);.
Henrik Opel

1
이것은 나에게 약간 추한 것처럼 보이지만 실제로 배열 요소를 검사하는 경우 훨씬 더 의미 isset($foo[$bar])가 있습니다.array_key_exists($bar, $foo)
Arild

property_exists> property_exists () 함수는 __get magic 메소드를 사용하여 마술처럼 액세스 할 수있는 속성을 감지 할 수 없습니다.
alexw

@alexw __get을 통해 "만들어진"변수는 실제로 존재하지 않습니다. __get은 존재하지 않는 변수의 대체로 사용되는 임의의 코드로, 관련 데이터가 저장되었는지 여부에 관계없이 원하는 것을 반환 할 수 있습니다.
Brilliand

46

다양한 토론과 답변에 대한 개요를 제공하려고합니다.

isset사용할 수있는 모든 방법을 대체 할 수있는 질문에 대한 단일 답변은 없습니다 . 일부 유스 케이스는 다른 기능으로 해결되는 반면, 다른 유스 케이스는 정밀 조사를지지하거나 코드 골프를 넘어 모호한 가치를 지니지 않습니다. "파손 된"또는 "일관되지 않은"것과는 달리, 다른 유스 케이스는 왜 isset반응 null이 논리적 행동 인지를 보여줍니다 .

실제 사용 사례 (솔루션 포함)

1. 배열 키

배열은 마치 변수처럼 취급 unset하고 변수의 집합처럼 취급 될 수 있습니다 isset. 그러나 반복, 계산 등이 가능하므로 결 측값은 값이 아닌 값과 다릅니다 null.

이 경우의 대답은 대신에 사용하는 array_key_exists()것입니다isset() .

이것은 배열을 함수 인수로 검사하기 때문에 배열 자체가 존재하지 않으면 PHP는 여전히 "알림"을 발생시킵니다. 경우에 따라 각 차원을 먼저 초기화해야한다고 주장 할 수 있으므로 통지가 제대로 수행되고 있습니다. 다른 경우 array_key_exists에는 배열의 각 차원을 차례로 확인한 "재귀" 함수는이를 피하지만 기본적으로와 동일합니다 @array_key_exists. 또한 null값을 처리하는 데 다소 접 합니다.

2. 객체 속성

"객체 지향 프로그래밍"의 전통적인 이론에서 캡슐화와 다형성은 객체의 주요 속성입니다. PHP의 같은 클래스 기반 OOP 구현에서, 캡슐화 된 속성은 클래스 정의의 일부로 선언하고, 주어진 액세스 수준 ( public, protected또는 private).

그러나 PHP를 사용하면 배열의 키처럼 객체에 속성을 동적으로 추가 할 수 있으며 일부 사람들은 비슷한 클래스에서 객체가없는 객체 (기술적으로는 내장 stdClass또는 인스턴스 가없는 메소드)를 사용합니다 연관 배열 방법. 이것은 특정 속성이 주어진 객체에 추가되었는지 함수가 알고 싶어하는 상황으로 이어집니다.

배열 키와 마찬가지로 객체 속성을 확인하기위한 솔루션이 언어에 합리적으로 충분히 포함되어 있습니다property_exists .

토론이 가능한 정당하지 않은 사용 사례

3. register_globals글로벌 네임 스페이스의 기타 오염

register_globals기능은 HTTP 요청 (GET 및 POST 매개 변수 및 쿠키)의 측면에 따라 이름이 결정되는 전역 범위에 변수를 추가했습니다. 이로 인해 버그가 많고 안전하지 않은 코드가 생길 수 있으며, 이는 2000 년 8 월에 릴리스 된 PHP 4.2 이후 기본적으로 비활성화되어 2012 년 3 월에 출시 된 PHP 5.4 에서 완전히 제거 이유 입니다. 그러나 일부 시스템은이 기능을 사용하거나 에뮬레이트 한 상태로 계속 실행 중일 수 있습니다. global키워드 또는 $GLOBALS배열을 사용하여 다른 방식으로 전역 네임 스페이스를 "폴링"할 수도 있습니다 .

첫째, register_globals자체가 예기치 않게 생산할 가능성이 null는 GET, POST 이후, 변수 및 쿠키 값은 항상 (와 문자열이 될 것입니다 ''여전히 반환 true에서 isset), 세션 변수는 프로그래머의 통제하에 완전히 있어야한다.

둘째, 값 null이 있는 변수의 오염은 이전 초기화를 덮어 쓰는 경우에만 문제가됩니다. 초기화되지 않은 변수를 "덮어 쓰기"하는 null것은 다른 곳의 코드가 두 상태를 구별하는 경우에만 문제가 될 수 있으므로, 이러한 가능성은 그 자체 로 그러한 구별을 만드는 것에 반대 하는 주장 입니다.

4. get_defined_vars그리고compact

PHP에서 드물게 사용되는 몇 가지 함수 (예 : get_defined_varsand compact)를 사용하면 변수 이름을 배열의 키인 것처럼 취급 할 수 있습니다. 전역 변수의 경우 수퍼 전역 배열$GLOBALS 은 비슷한 액세스를 허용하며 더 일반적입니다. 변수가 관련 범위에 정의되어 있지 않으면 이러한 액세스 방법은 다르게 작동합니다.

이러한 메커니즘 중 하나를 사용하여 변수 집합을 배열로 취급하기로 결정한 후에는 일반 배열에서와 동일한 모든 작업을 수행 할 수 있습니다. 따라서 1을 참조하십시오.

이러한 함수의 동작을 예측하기 위해서만 존재했던 기능 (예 : " get_defined_vars?에 의해 반환 된 배열에 키 'foo'가 있을까요?")은 단순히 함수를 실행하고 악영향없이 찾을 수 있기 때문에 불필요한 기능입니다.

4a. 변수 변수 ( $$foo)

변수 세트를 연관 배열로 바꾸는 함수와 완전히 동일하지는 않지만 "변수 변수" ( "이 다른 변수를 기반으로 이름 지정된 변수에 지정")를 사용하는 대부분의 경우 연관 배열을 대신 사용하도록 변경해야합니다. .

변수 이름은 기본적으로 프로그래머가 값에 부여한 레이블입니다. 런타임에 결정하는 경우 실제로 레이블이 아니라 일부 키-값 저장소의 키입니다. 실제로는 배열을 사용하지 않으면 계산, 반복 등의 기능이 손실됩니다. 키-값 저장소에 변수를 "외부"로 덮어 쓰는 것도 불가능할 수 있습니다 $$foo.

연관 배열을 사용하도록 변경되면 코드는 솔루션 1을 준수 할 수 있습니다. 간접 오브젝트 특성 액세스 (예 $foo->$property_name:)는 솔루션 2로 처리 될 수 있습니다.

5. isset입력하는 것보다 훨씬 쉽다array_key_exists

나는 이것이 실제로 관련이 있는지 확실하지 않지만, 그렇습니다. PHP의 함수 이름은 때로는 길고 일관성이 없을 수 있습니다. 분명히, 이전 버전의 PHP는 함수 이름의 길이를 해시 키로 사용했기 때문에 Rasmus는 의도적으로 함수 이름 htmlspecialchars을 구성하여 특이한 수의 문자를 갖습니다 ...

그래도 적어도 우리는 Java를 작성하지 않습니다. ;)

6. 초기화되지 않은 변수에는 유형이 있습니다

변수 기본 사항에 대한 매뉴얼 페이지 에는 다음 내용이 포함되어 있습니다.

초기화되지 않은 변수는 사용되는 컨텍스트에 따라 유형이 기본값입니다.

Zend Engine에 "초기화되지 않았지만 알려진 유형"이라는 개념이 있는지 또는 문을 너무 많이 읽었는지 확실하지 않습니다.

초기화되지 않은 변수에 대해 해당 페이지에 설명 된 동작은 값이 인 변수의 동작과 동일하므로 동작에 실질적인 차이가 없습니다 null. 하나의 예를 선택하려면, 모두 $a$b이 코드의 정수로 끝날 것입니다 42:

unset($a);
$a += 42;

$b = null;
$b += 42;

(첫 번째는 더 나은 코드를 작성하기 위해 선언되지 않은 변수에 대한 통지를 제기하지만 코드가 실제로 어떻게 실행되는지에 영향을 미치지는 않습니다.)

99. 기능 실행 여부 감지

(이것은 다른 것보다 훨씬 길므로 마지막에 유지하십시오. 나중에 편집 할 것입니다 ...)

다음 코드를 고려하십시오.

$test_value = 'hello';
foreach ( $list_of_things as $thing ) {
    if ( some_test($thing, $test_value) ) {
        $result = some_function($thing);
    }
}
if ( isset($result) ) {
    echo 'The test passed at least once!';
}

some_function반환 할 수있는 경우 null, 반환 echo되더라도 원에 도달하지 못할 가능성이 있습니다 . 프로그래머의 의도는 설정되지 않은 시간 을 감지하는 것이지만 PHP는 그렇게 할 수 없습니다.some_testtrue$result

그러나이 방법에는 다른 문제가 있으며 외부 루프를 추가하면 분명해집니다.

foreach ( $list_of_tests as $test_value ) {
    // something's missing here...
    foreach ( $list_of_things as $thing ) {
        if ( some_test($thing, $test_value) ) {
            $result = some_function($thing);
        }
    }
    if ( isset($result) ) {
        echo 'The test passed at least once!';
    }
}

$result명시 적으로 초기화되지 않기 때문에 첫 번째 테스트가 통과되면 값을 사용하므로 후속 테스트가 통과했는지 여부를 알 수 없습니다. 변수가 제대로 초기화되지 않은 경우 실제로 매우 일반적인 버그입니다.

이 문제를 해결하려면 누락 된 항목에 대해 언급 한 라인에서 무언가를 수행해야합니다. 가장 확실한 해결책은 결코 반환 할 수없는 $result"터미널 값" 으로 설정 하는 것입니다 some_function. 이것이 인 경우 null나머지 코드는 정상적으로 작동합니다. some_function매우 예측할 수없는 리턴 유형 (아마도 자체적으로 잘못된 부호 일 수 있음)이 있기 때문에 터미널 값에 대한 자연스러운 후보가없는 경우 추가 부울 값 (예 :)을 $found대신 사용할 수 있습니다.

하나의 실험 : very_null상수

PHP는 이론적 null으로 터미널 값으로 사용 하기위한 특별한 상수를 제공 할 수 있습니다. 아마도 함수에서 이것을 반환하는 것은 불법이거나로 강제 변환 null될 것이며 아마도 함수 인수로 전달하는 경우에도 마찬가지입니다. 이렇게하면이 특정 사례가 약간 더 간단 해지지 만 코드를 리팩터링하기로 결정하자마자-예를 들어 내부 루프를 별도의 함수에 넣으면 쓸모가 없게됩니다. 함수간에 상수를 전달할 수 있으면 some_function반환하지 않을 것이라고 보장 할 수 없으므로 더 이상 범용 터미널 값으로 유용하지 않습니다.

이 경우 초기화되지 않은 변수를 감지하기위한 인수는 해당 특수 상수에 대한 인수로 귀결됩니다. 주석을로 바꾸고 unset($result)이를 다르게 처리하는 경우 전달할 수없는 $result = null"값"을 가져 $result오는 것만 가능합니다. 특정 내장 기능에 의해 감지됩니다.

실험 2 : 할당 카운터

마지막 if질문 에 대해 생각하는 또 다른 방법 은 "무엇이 할당되어 $result있습니까?"입니다. 이 값을의 특별한 값으로 생각하기보다는 $result이것을 Perl의 "variable tainting"과 같은 변수 에 대한 "메타 데이터"로 생각할 수 있습니다. 그래서보다는 isset당신이 그것을 호출 할 수 있습니다 has_been_assigned_to, 그리고보다는 unset, reset_assignment_state.

그렇다면 그렇다면 부울에 멈추는 이유는 무엇입니까? 시험이 몇 번이나 통과 했는지 알고 싶다면 어떻게해야합니까? 당신은 단순히 메타 데이터를 정수로 확장 할 수 get_assignment_count있고 reset_assignment_count...

분명히 이러한 기능을 추가하면 언어의 복잡성과 성능이 저하 될 수 있으므로 예상되는 유용성과 비교하여 신중하게 평가해야합니다. very_null상수 와 마찬가지로 매우 좁은 환경에서만 유용하며 리팩토링에 유사하게 저항합니다.

희망적으로 명백한 질문은 PHP 런타임 엔진이 일반 코드를 사용하여 명시 적으로 수행하지 않고 그러한 것들을 추적하고 싶다고 미리 가정해야하는 이유입니다.


클래스 및 속성과 관련하여 속성이 배열 인 경우 슬프게도 property_exists ()가 작동하지 않습니다 (예 : Class {public $ property = array ()}). 오류가 발생합니다.
Andrew

1
@Andrew 는 나를 위해 잘 작동하는 것 같습니다 : 3v4l.org/TnAY5 완전한 예를 제공 하시겠습니까?
IMSoP 2016 년

예, 잘 작동하는 것 같습니다. 설정에 문제가 있습니다. 잘못된 경보에 대해 죄송합니다 :)
Andrew

20

때로는 주어진 상황에서 어떤 비교 연산을 사용할 것인지 알아 내려고 조금씩 잃어 버렸습니다. isset()초기화되지 않은 또는 명시 적으로 null 값에만 적용됩니다. null 전달 / 할당은 논리적 비교가 예상대로 작동하도록하는 좋은 방법입니다.

여전히 생각하기가 약간 어렵 기 때문에 다른 연산으로 다른 값을 평가하는 방법을 비교하는 간단한 매트릭스가 있습니다.

|           | ===null | is_null | isset | empty | if/else | ternary | count>0 |
| -----     | -----   | -----   | ----- | ----- | -----   | -----   | -----   |
| $a;       | true    | true    |       | true  |         |         |         |
| null      | true    | true    |       | true  |         |         |         |
| []        |         |         | true  | true  |         |         |         |
| 0         |         |         | true  | true  |         |         | true    |
| ""        |         |         | true  | true  |         |         | true    |
| 1         |         |         | true  |       | true    | true    | true    |
| -1        |         |         | true  |       | true    | true    | true    |
| " "       |         |         | true  |       | true    | true    | true    |
| "str"     |         |         | true  |       | true    | true    | true    |
| [0,1]     |         |         | true  |       | true    | true    | true    |
| new Class |         |         | true  |       | true    | true    | true    |

테이블에 맞추기 위해 레이블을 약간 압축했습니다.

  • $a; 선언되었지만 할당되지 않은 변수를 나타냅니다.
  • 첫 번째 열의 다른 모든 항목은 다음과 같이 할당 된 값을 나타냅니다.
    • $a = null;
    • $a = [];
    • $a = 0;
  • 열은 다음과 같은 비교 작업을 나타냅니다.
    • $a === null
    • isset($a)
    • empty($a)
    • $a ? true : false

모든 결과는 부울이고 true인쇄되며 false생략됩니다.

테스트를 직접 실행할 수 있습니다.이 요점을 확인하십시오 :
https://gist.github.com/mfdj/8165967


이 질문의 범위를 벗어 났을 수도 있지만 작업 "0"의 완전성과 명확성을 위해 테이블 에 추가하고 싶을 수도 있습니다.empty
Rik Schaaf

17

간결한 언어 구문을 사용하여 null 변수가 있는지 테스트 할 수 있습니다. 존재하지 않는 변수는 결과에 나타나지 않지만 null 값은 표시됩니다.

$x = null;
$y = 'y';

$r = compact('x', 'y', 'z');
print_r($r);

// Output:
// Array ( 
//  [x] => 
//  [y] => y 
// ) 

귀하의 예의 경우 :

if (compact('v')) {
   // True if $v exists, even when null. 
   // False on var $v; without assignment and when $v does not exist.
}

물론 전역 범위의 변수의 경우 array_key_exists ()를 사용할 수도 있습니다.

Btw 개인적으로 나는 존재하지 않는 변수와 null 값을 가진 변수 사이에 의미 론적 차이가있는 전염병과 같은 상황을 피할 것입니다. PHP와 다른 대부분의 언어는 존재한다고 생각하지 않습니다.


3
PHP는 그렇지 않지만 대부분의 다른 언어는 그렇지 않습니다. 변수를 선언하지 않은 경우 변수를 선언하는 대부분의 언어에서 오류가 발생하지만로 설정할 수 있습니다 NULL. 의미, NULL"어떤 자원"을 의미 없지만 변수를 정의하지 것은 프로그래머 오류가 발생합니다.
M Miller

1
@MMiller 물론이지만 "자원 없음"의 경우 한 경로를 따르고 "프로그래머 오류"의 경우 다른 경로를 따르는 코드를 작성하는 것은 상당히 의미가 없습니다. 디버깅 중에 선언되지 않은 변수를 감지하려면 모든 언어에서 잠재적 오류를 찾는 것처럼 정적 분석 도구를 사용하십시오.
IMSoP

@MMiller, Cool, 어떻게 생각 했어?
Pacerier

1
@MMiller 그러나 대답의 진술은 "존재하지 않는 변수"에 대한 것이며, 반대의 예는 존재하지 않는 객체 속성 / 해시 키 에 관한 것이므로 반박으로 작동하지 않습니다 . 이러한 경우의 차이점은 단순한 부수적 인 것이 아닙니다.
IMSoP

1
@MMiller-실제로 더 좋은 예입니다. 그러나 20 년 후 엄격한 언어 프로그래밍, 나는 사이의 구분을 필요로하는 상황 undefined과는 null내가 그것을 놓치지 않도록 드물다. IMHO의 주요 용도 undefined는 "엄격하지 않은 언어의 프로그래머 오류"입니다. 엄격한 언어로에 대해 별도의 상태가 필요한 경우 client did not state a value상황에 적합한 값을 선언하고 테스트하십시오. 최악의 경우 별도의 플래그 변수를 추가해야합니다. 그러나 두 가지 다른 비 가치 상태 에 항상 대처하는 것보다 낫지 않습니다 !
ToolmakerSteve

15

논리적으로 생각하고 NULL을 설명

이 모든 것에 대한 명백한 대답은 다음과 같습니다. 변수를 NULL로 초기화하지 말고 의도 된 것과 관련이있는 것으로 초기화하십시오.

NULL을 올바르게 처리

NULL은 "존재하지 않는 값"으로 취급되어야하며 이는 NULL의 의미입니다. 변수는 어떤 유형의 엔티티인지 알 수 없으므로 PHP에 기존 변수로 분류 될 수 없습니다. 그것은 존재하지 않을 수도 있으므로, PHP는 단지 "좋아요. 아무 의미가 없기 때문에 아닙니다. NULL은 이것을 말하는 방법입니다."

논쟁

지금 논쟁합시다. "하지만 NULL은 0 또는 FALSE 또는``와 같습니다."

잘못된 0-FALSE- ''는 여전히 빈 값으로 분류되지만 일부 유형의 값 또는 질문에 대한 미리 결정된 답변으로 지정됩니다. FALSE 는 예 또는 아니오에 대한 답이고, '' 는 누군가가 제출 한 제목에 대한 답이며, 0 은 수량 또는 시간 등에 대한 답입니다. 어떤 유형의 답변 / 결과로 설정되어 설정 한대로 유효합니다.

NULL은 응답이 없으며 예 또는 아니오를 알려주지 않으며 시간을 알려주지 않으며 빈 문자열이 제출되었음을 알려주지 않습니다. 이것이 NULL을 이해하는 기본 논리입니다.

요약

문제를 해결하기 위해 엉뚱한 함수를 만드는 것이 아니라 뇌가 NULL을 보는 방식을 바꾸는 것입니다. NULL이면 아무것도 설정되지 않은 것으로 가정합니다. 변수를 사전 정의하는 경우 사용하려는 유형에 따라 0, FALSE 또는 ""로 사전 정의하십시오.

이 말을 인용하십시오. 내 논리적 인 머리 꼭대기에서 벗어났습니다. :)


5
좋은 대답입니다. 여러 번 나는 사람들이 언어의 이런 특징이나 그 특징을 싫어하는 방식에 대해 뛰고있는 것을 보았다. 그러나 그들은 "내 방식대로하지 않으면 망가졌다"고 가정하고있는 것으로 보인다. 그렇습니다. 잘못된 디자인 결정이 있습니다. 그러나 매우 가까운 개발자도 있습니다!
curtisdf

23
설정되지 않은 변수와 variable === null 사이에는 큰 차이가 있습니다. 하나는 존재하지 않고 다른 하나는 null 값을 갖습니다. null이라는 주장은 단순히 가치가 없다는 것을 의미합니다. 널은 널 유형의 값입니다. 그것은 완벽하게 유효한 가치이며 php가 그것을 존재하지 않는 가치로 취급 할 이유가 없습니다. 존재하지 않는 변수가 널이고 기존의 모든 변수가 널이 아니고 변수에 널을 지정하면 설정이 해제되는 것이 좋습니다. 그러나 함수가 실제 값으로 null을 반환하는 많은 상황이 있습니다. 그런 다음 테스트 할 피의 방법이 없기 때문에 우리는 망쳤습니다.
enrey

2
나는 우리가 PHP에서 변수의 존재를 확인하기 위해 "의미되어 있지 않다"는 것을 알고 있습니다. PHP에서는 불가능하기 때문에 그것에 의존하는 코드를 작성하지 않을 것입니다. 그것은 PHP의 한계입니다. 설정되지 않은 변수와 null 변수 사이에는 분명히 차이가 있지만 php는 변수를 구별하는 방법을 제공하지 않습니다. 그러나 많은 메타 기능은 내부에 달려 있습니다. 존재하지 않는 var를 읽으면 알림 이 표시되고 null이면 isset($a['x'])false를 알려주지 만 .에 x표시됩니다 count($a). compact등을 포함한 모든 설정된 변수에서 작동 nulls합니다.
enrey

3
이 답변은 한 가지 주요 방식으로 결함이 있습니다. OO 프로그래밍에서 "객체 없음"을 의미하는 논리적 선택은 null입니다. 예를 들어, 함수가 객체를 반환하거나 객체를 반환 할 수없는 예외적 인 상황에서는 null이 확실한 선택입니다. 기술적으로 PHP에서는 false 또는 부울 컨텍스트에서 false로 간주되는 다른 값을 사용할 수 있지만 의미 순도는 손실됩니다. 따라서 null은 객체 가 될 의도와 관련 있기 때문에 객체를 결국 보유 해야하는 변수를 초기화하는 데 가장 합리적인 값 입니다.
chazomaticus

3
PHP가 정의되지 않은 변수에 대해 오류를 발생 시키지만 null이 아닌 한 차이가 있습니다. null과 undefined가 실제로 같은 개념이라면, PHP는 기본 undefined / declared 변수를 null로 가정하고 오류를 발생시키지 않아야하지만, 개발 악몽이기 때문에 아무도 원하지 않습니다. Null과 Undefined는 값 의미론의 맥락에서 실제로 다르지 않지만 명확하고 디버깅 가능한 코드를 작성하는 경우에는 매우 다릅니다.
Chris Middleton

9

개체 속성에 의해 존재 여부를 확인할 수 있습니다 property_exists

단위 테스트의 예 :

function testPropertiesExist()
{
    $sl =& $this->system_log;
    $props = array('log_id',
                   'type',
                   'message',
                   'username',
                   'ip_address',
                   'date_added');

    foreach($props as $prop) {
        $this->assertTrue(property_exists($sl, $prop),
                           "Property <{$prop}> exists");
    }
}

4

에 추가로 무엇을 NULL 수단의 greatbigmassive의 토론 , 실제로 무엇을 의미하는지 "변수의 존재를"고려하십시오.

많은 언어에서 모든 변수를 사용하기 전에 명시 적으로 선언해야합니다 . 이것에 의해 그 타입이 결정될 수 있지만,보다 중요하게는 scope를 선언합니다 . 변수는 그 범위 내 어디에서나 "존재"하고, 그 밖의 다른 곳에서는 전체 기능 또는 단일 "블록"이됩니다.

범위 내에서 변수 는 프로그래머가 선택한 레이블에 의미를 부여합니다 . 해당 범위를 벗어나면 해당 레이블은 의미가 없습니다 (다른 범위에서 동일한 레이블을 사용하는지 여부는 기본적으로 관련이 없습니다).

PHP에서는 변수를 선언 할 필요가 없습니다. 변수는 필요할 때 바로 작동합니다. 변수에 처음 쓸 때 PHP는 해당 변수에 대한 항목을 메모리에 할당합니다. 현재 엔트리가없는 변수를 읽는다면, PHP는 그 변수가 value를 갖는 것으로 간주합니다 NULL.

그러나 자동 코드 품질 감지기는 변수를 먼저 "초기화"하지 않고 변수를 사용하는 경우 일반적으로 경고합니다. 첫째, 이것은 할당 $thingId하지만 읽는 것과 같은 오타를 감지하는 데 도움이됩니다 $thing_id. 그러나 두 번째로, 선언처럼 변수가 의미가있는 범위를 고려해야합니다.

변수가 "존재"하는지 여부를 관리하는 모든 코드는 변수의 범위의 일부입니다. 초기화 여부에 관계없이 프로그래머는 코드의 해당 지점에서 레이블 의미를 부여했습니다. 당신이 그것을 사용하고 있기 때문에, 어떤 의미에서 "존재"하고, 존재한다면, 그것은 암묵적인 값을 가져야합니다; PHP에서 암시 적 값은 null입니다.

PHP가 작동하는 방식 때문에 존재하는 변수의 네임 스페이스를 의미있는 레이블 범위가 아니라 일종의 키-값 저장소로 처리하는 코드를 작성할 수 있습니다. 예를 들어 다음과 같은 코드를 실행할 수 있습니다 $var = $_GET['var_name']; $$var = $_GET['var_value'];. 당신이 할 수 있다고해서 그것이 좋은 생각 인 것은 아닙니다.

PHP는 연관 배열이라고 불리는 키-값 저장소를 표현하는 훨씬 더 좋은 방법을 가지고 있습니다. 배열의 값을 변수처럼 취급 할 수 있지만 배열에 대한 작업을 전체적으로 수행 할 수도 있습니다. 연관 배열이있는 경우을 사용하여 키가 포함되어 있는지 테스트 할 수 있습니다 array_key_exists().

비슷한 방식으로 객체를 사용하여 속성을 동적으로 설정할 수 있으며,이 경우 property_exists()정확히 동일한 방식으로 사용할 수 있습니다 . 물론, 당신이 클래스를 정의하는 경우, 당신은 한 어떤 속성을 선언 할 수 있습니다 당신도 선택할 수 있습니다 - public, privateprotected범위.

초기화되지 않은 (또는 명시 적으로 ) 변수 (배열 키 또는 객체 속성과 달리)와 기술적으로 차이 가 있지만 그 차이를 의미있는 것으로 간주하는 모든 코드 변수를 사용하지 않는 방식으로 사용하고 있습니다.unset()null


1
질문에 대한 정확한 대답은 아니지만 매우 좋은 점입니다.
chazomaticus

1
"PHP에 변수가 있는지 어떻게 안정적으로 확인해야합니까?"라는 명백한 질문에 내 대답은 "당신은 아니고 여기에 이유가 있습니다"입니다. 이 답변과 greatbigmassive의 답변 모두 "왜 그렇게 행동 하는가?" 라는 암묵적인 질문 에도 대답합니다 isset().
IMSoP

"현재 항목이없는 변수를 읽으면 PHP는 해당 변수가 NULL 값을 갖는 것으로 간주합니다." 이것은 거짓입니다. 정의되지 않은 변수는 단순히 정의되어 있지 않습니다. 액세스하려고하면 null을 반환 할 수 있지만 관련이 없습니다.
휴고 징크

@HugoZink 무엇과 관련이 없습니까? 정의되지 않은 변수 의 을 테스트하면 값이임을 알 수 있습니다 null. 그 가치가 당신이 그것을보기 전에 존재하는지는 철학자들에게는 문제이지만, 관찰 가능한 행동에 관한 한 그 가치는 일관되게 null있습니다.
IMSoP

3

isset변수가 설정되어 있는지 확인하고, 설정되어 있으면 이 NULL이 아닌지 확인합니다. 후자의 부분은 (내 의견으로는)이 기능의 범위 내에 있지 않습니다. 변수가 설정되지 않았 거나 명시 적으로 NULL로 설정 되었기 때문에 NULL인지 여부를 결정하는 적절한 해결 방법 은 없습니다 .

가능한 해결책은 다음과 같습니다.

$e1 = error_get_last();
$isNULL = is_null(@$x);
$e2 = error_get_last();
$isNOTSET = $e1 != $e2;
echo sprintf("isNOTSET: %d, isNULL: %d", $isNOTSET, $isNULL);

// Sample output:
// when $x is not set: isNOTSET: 1, isNULL: 1
// when $x = NULL:     isNOTSET: 0, isNULL: 1
// when $x = false:    isNOTSET: 0, isNULL: 0

다른 해결 방법은 get_defined_vars() .

$vars = get_defined_vars();
$isNOTSET = !array_key_exists("x", $vars);
$isNULL = $isNOTSET ? true : is_null($x);
echo sprintf("isNOTSET: %d, isNULL: %d", $isNOTSET, $isNULL);

// Sample output:
// when $x is not set: isNOTSET: 1, isNULL: 1
// when $x = NULL:     isNOTSET: 0, isNULL: 1
// when $x = false:    isNOTSET: 0, isNULL: 0

2

NULL에 대한 당신의 추론에 동의하지 않습니다 에 , 에 대한 사고 방식을 변경해야한다고 말하는 것은 이상합니다.

isset ()이 올바르게 설계되지 않았다고 생각합니다. isset ()은 변수가 설정되어 있는지 알려주고 변수의 실제 값과 관련해서는 안됩니다.

데이터베이스에서 반환 된 값을 확인하고 열 중 하나에 NULL 값이있는 경우 값이 NULL 인 경우에도 여전히 존재하는지 알고 싶습니다 ... nope dont isset () here.

마찬가지로

$a = array ('test' => 1, 'hello' => NULL);

var_dump(isset($a['test']));   // TRUE
var_dump(isset($a['foo']));    // FALSE
var_dump(isset($a['hello']));  // FALSE

isset ()은 다음과 같이 작동하도록 설계되어야합니다.

if(isset($var) && $var===NULL){....

이 방법으로 우리는 프로그래머에게 유형을 확인하고 값이 NULL이기 때문에 isset ()에 두지 않고 그것을 설정하지 않습니다-단지 바보 같은 디자인


귀하의 예는 변수의 존재를 확인하는 것이 아니라 배열 키를 확인하는 것입니다. 에 대한 해결책은의 형태로 존재합니다 array_key_exists. 실제 변수가 존재하는 경우 런타임에 알 수없는 상황에 있어서는 안됩니다.
IMSoP

@chazomaticus 글쎄, 당신은 register_globals가 켜져있는 상황에 있어서는 안됩니다. 그래서 나는 그 진술을지지합니다.
IMSoP

아 동의합니다. 그럼에도 불구하고 모든 사람이 코드가 배포되는 위치를 제어 할 수있는 것은 아닙니다. 상황이 어떻게되어야하는지에 상관없이 모든 상황에 대한 정보를 갖는 것이 유용합니다.
chazomaticus 2009 년

@chazomaticus 만약 문제가 register_globals이면, 당신의 대답은로 바뀌지 않습니다 isset(). PHP 매뉴얼 은 "일반적으로 변수를 먼저 초기화하는 것이 좋은 프로그래밍 관행"이라고 언급하며, 이는 register_globals런타임보다는 디자인 타임에 해결 됩니다. 런타임에 처리 할 수 있는 기능을 제공 하는 FAQ 항목 도 있습니다 unregister_globals().
IMSoP

2

여기에 2 센트를 빠르게 추가 할 것입니다. 이 문제가 혼동을 일으키는 한 가지 이유는이 시나리오가 오류보고 가 완전 하지 않은 동일한 결과를 반환하는 것 같습니다 .

$a = null;
var_dump($a); // NULL
var_dump($b); // NULL

이 결과 에서 $a = null정의하지 않은 것과 정의하지 않은 것의 차이 $b는 아무것도 아니라고 가정 할 수 있습니다 .

크랭크 오류보고 :

NULL

Notice: Undefined variable: b in xxx on line n
NULL

참고 : 정의되지 않은 변수 오류가 발생했지만의 출력 값 var_dump은 여전히 NULL입니다.

PHP는 분명히 널 변수와 정의되지 않은 변수를 구별하는 내부 기능을 가지고 있습니다. 이것을 확인하는 내장 함수가 있어야한다고 생각합니다.

나는 받아 들인 대답이 대부분 좋다고 생각하지만 구현하려고하면 래퍼를 작성합니다. 이 답변에서 이전에 언급했듯이 , 나는 이것이 실제로 문제가 된 상황에 직면하지 않았다는 것에 동의해야합니다. 변수가 설정 및 정의되었거나 정의되지 않은 (undefined, unset, null, blank 등) 시나리오에서 거의 항상 종료되는 것처럼 보입니다. 이와 같은 상황은 미래에 발생하지 않을 것이라고 말할 수는 없지만 매우 독특한 문제 인 것처럼 PHP 개발자가 이것을 넣지 않아도된다는 사실에 놀라지 않습니다.


정의되지 않은 변수에 대한 경고는 프로그래머가 코드에서 무언가 잘못했다고 힌트입니다. 언어 외부에 도구가있는 디버깅 외부에서는 프로그래머가 선언하는 변수를 항상 알아야하므로 프로그램이 그러한 상태를 감지 할 필요가 없어야합니다.
IMSoP

1

내가 다음을 실행하면 :

echo '<?php echo $foo; ?>' | php

오류가 발생합니다.

PHP Notice:  Undefined variable: foo in /home/altern8/- on line 1

내가 다음을 실행하면 :

echo '<?php if ( isset($foo) ) { echo $foo; } ?>' | php

오류가 발생하지 않습니다.

설정해야 할 변수가 있으면 일반적으로 다음과 같은 작업을 수행합니다.

$foo = isset($foo) ? $foo : null;

또는

if ( ! isset($foo) ) $foo = null;

이렇게하면 나중에 스크립트에서 $ foo를 안전하게 사용하고 "설정"되어 있으며 기본값은 null이라는 것을 알 수 있습니다. 나중에 할 수 있습니다if ( is_null($foo) ) { /* ... */ } 변수가 null 인 경우에도 변수가 존재하는지 알아야 .

전체 isset 문서 는 처음에 붙여 넣은 것보다 조금 더 읽습니다. 예, 이전에 설정되었지만 이제는 null 인 변수에 대해서는 false를 반환하지만 변수가 아직 설정되지 않았거나 설정되지 않은 변수에 대해서는 false를 반환합니다. 또한 NULL 바이트 ( "\ 0")는 null로 간주되지 않으며 true를 반환합니다.

변수가 설정되어 있는지 확인하십시오.

변수가 unset ()으로 설정 해제 된 경우 더 이상 설정되지 않습니다. NULL로 설정된 변수를 테스트하면 isset ()은 FALSE를 반환합니다. 또한 NULL 바이트 ( "\ 0")는 PHP NULL 상수와 동일하지 않습니다.


그는 그 링크에서 문서를 가져 왔습니다. 귀하가 제공 한 링크에서 설명 섹션의 첫 번째 문장, 두 번째 단락을 읽으십시오. 위에서 인용 한 내용과 동일합니다.
Zoredache

간단한 스크립트에는 좋지 않은 방법이 아니지만 복잡한 (예 : 대규모 OO) 프로젝트에서는 실행할 수 없습니다. 또한 위에서 말했듯이 is_null ()은 설정되지 않은 변수에 대해 TRUE를 반환하므로 PHP 경고를 피하기 위해 말한 것을 할 이유가 없습니다.
chazomaticus

1
잘 설계된 "대규모 OO"프로젝트의 경우 왜 이것이 전혀 문제가되지 않습니까? 왜 처음 사용하기 전에 설정되지 않은 메소드 본문에 $ foo가 있습니까?
Beau Simensen

1

사용해보십시오

unset($v)

변수가 설정되지 않은 유일한 시간은 변수가 구체적으로 설정되어 있지 않은 것 같습니다 ($ v). '존재'의 의미가 PHP의 정의와 다른 것 같습니다. NULL은 확실히 존재하며 NULL입니다.


무슨 말인지 잘 모르겠습니다. 하나의 요소 'a'를 가진 배열이있는 경우 PHP에 존재하지 않는 요소 'b'에 대해 요소 'b'를 unset () 할 필요가 없으며 단지 존재하지 않습니다. 전역 변수와 같은 것, $ GLOBALS 배열의 요소로 생각할 수 있습니다.
chazomaticus

1
그러나 NULL 값을 가진 변수가 실제로 존재한다는 데 동의합니다.
chazomaticus

0

몇 년 동안 PHP 프로그래밍 isset()을 할 때 null 변수에서 false를 반환 하는 데 문제가 발생하지 않았습니다 . OTOH, isset()null 배열 항목에 실패하는 데 문제가 있습니다.array_key_exists() 그 경우 올바르게 작동합니다.

비교를 위해, Icon은 사용되지 않는 변수를 반환으로 명시 적으로 정의하므로 Icon &null의 is-null 테스트를 사용하여 설정되지 않은 변수도 확인합니다. 이것은 일을 더 쉽게 만듭니다. 반면 Visual BASIC에는 값이없는 변수 (Null, Empty, Nothing, ...)에 대해 여러 상태가 있으며 종종 둘 이상의 변수를 확인해야합니다. 이것은 버그의 원인으로 알려져 있습니다.


0

empty () 함수에 대한 PHP 매뉴얼에 따르면, "변수가 비어 있는지 결정하십시오. 변수가 존재하지 않거나 값이 FALSE 인 경우 변수는 비어있는 것으로 간주됩니다. empty ()는 변수가 없습니다. " (제 강조) 이것은 empty () 함수가 제목 Question에 따라 "PHP에서 변수의 존재를 테스트하는 가장 좋은 방법"으로 규정되어야한다는 것을 의미합니다.

그러나 empty () 함수는 존재하고 NULL로 설정된 변수에 의해 속일 수 있기 때문에 이것은 충분하지 않습니다.

나는 원래의 답변 (비교를 위해이 중단을 따르는)보다 덜 성가시기 때문에 더 나은 것을 제시하기 위해 이전 답변을 중단하고 있습니다.

  function undef($dnc) //do not care what we receive
  { $inf=ob_get_contents();             //get the content of the buffer
    ob_end_clean();                     //stop buffering outputs, and empty the buffer
    if($inf>"")                         //if test associated with the call to this function had an output
    { if(false!==strpos($inf, "Undef"); //if the word "Undefined" was part of the output
        return true;                    //tested variable is undefined
    }
    return false;                       //tested variable is not undefined
  }

간단한 두 줄의 코드는 위 함수를 사용하여 변수가 정의되어 있지 않은지 알 수 있습니다.

  ob_start();                           //pass all output messages (including errors) to a buffer
  if(undef($testvar===null))            //in this case the variable being tested is $testvar

이 예제와 같이 적절한 두 가지 행을 따라갈 수 있습니다.

    echo("variable is undefined");
  else
    echo("variable exists, holding some value");

함수 내부에 ob_start () 및 ($ testvar === null)을 호출하고 변수를 단순히 함수에 전달하려고했지만 작동하지 않습니다. 함수에 변수의 "참조로 전달"을 사용하려고해도 변수 BECOMES가 정의 된 후 함수가 이전에 정의되지 않았 음을 감지 할 수 없습니다. 여기에 제시된 것은 내가하고 싶었던 것과 실제로 작동하는 것 사이의 타협입니다.

앞의 내용은 "정의되지 않은 변수"오류 메시지가 표시되는 것을 항상 피할 수있는 다른 방법이 있음을 나타냅니다. (이러한 가정은 그러한 메시지를 방지하기 때문에 변수가 정의되지 않았는지 테스트하려는 이유입니다.)

   function inst(&$v) { return; }  //receive any variable passed by reference; instantiates the undefined

$ testvar에 무언가를하기 전에 그 함수를 호출하면됩니다 :

   inst($testvar);                //The function doesn't affect any value of any already-existing variable

새로 인스턴스화 된 변수의 값은 물론 null로 설정됩니다!

(중단 종료)

따라서 공부하고 실험 한 후에는 다음과 같이 작동합니다.

 function myHndlr($en, $es, $ef, $el)
 { global $er;
   $er = (substr($es, 0, 18) == "Undefined variable");
   return;
 }

 $er = false;
 if(empty($testvar))
 { set_error_handler("myHndlr");
   ($testvar === null);
   restore_error_handler();
 }
 if($er)  // will be 1 (true) if the tested variable was not defined.
 { ; //do whatever you think is appropriate to the undefined variable
 }

설명 : 변수 $ er가 기본값 "오류 없음"으로 초기화되었습니다. "핸들러 함수"가 정의되었습니다. $ testvar (정의되지 않았는지 여부를 알고 싶은 변수)가 예비 empty () 함수 테스트를 통과하면 더 철저한 테스트를 수행합니다. 이전에 정의 된 핸들러 함수를 사용하기 위해 set_error_handler () 함수를 호출합니다. 그런 다음 정의되지 않은 오류가 발생하면 $ testvar과 관련된 간단한 ID 비교를 수행합니다. 핸들러 함수는 오류를 캡처하고 특히 오류 이유가 변수가 정의되어 있지 않은지 여부를 테스트합니다. 결과는 오류 정보 변수 $ er에 배치되며, 나중에 $ testvar의 정의 여부를 확인한 결과 원하는대로 수행 할 수 있습니다. 이 제한된 목적을 위해 처리기 기능 만 필요하기 때문에 원래 오류 처리 기능을 복원합니다. "myHndlr"함수는 한 번만 선언하면됩니다. 다른 코드는 $ testvar 또는이 방법으로 테스트하려는 다른 변수의 경우 적절한 위치에 복사 할 수 있습니다.


1
변수가 선언되지 않았다는 경고를 피하려는 의도라면 코드를 수정하여 변수를 올바르게 선언해야합니다. 귀하의 inst기능은 기본적으로 @오류 억제 연산자와 같습니다. "여기서 내가 잘못하고 있다는 것을 알고 있지만 실제로 어떤 식 으로든 코드 작업을 변경하지 않고 해당 메시지가 사라지기를 원합니다."
IMSoP

다른 한편으로, 탐지 방법은 독창적이지만, 나는 여전히 당신이 그들이 잡는 매우 경고 메시지를 에코하는 것 외에는 절대로 그들을 사용해서는 안된다는 확고한 신념을 가지고 있습니다. (출력 버퍼링 버전에는 error_reporting set high 및 display_errors가 켜져 있어야 함을 분명히해야합니다.)
IMSoP

0

나는 단지 전체 솔루션을 생각 통지를보고 와 함께

error_reporting(E_ALL); // Enables E_NOTICE

그러나 정의되지 않은 변수, 상수, 배열 키, 클래스 속성으로 생성 된 모든 통지를 수정해야합니다. 일단 그렇게하면 선언 된 변수와 선언되지 않은 변수의 차이에 대해 걱정할 필요가 없으며 모호성이 사라집니다.

알림보고를 활성화 하는 것이 모든 상황에서 좋은 대안은 아니지만이를 활성화해야하는 이유는 다음과 같습니다.

왜 E_NOTICE 오류를 수정해야합니까?

필자의 경우 1 년 이상이 없으면 proyect에서 일했지만 변수 선언에주의를 기울여 전환이 빨랐습니다.


0

변수가 현재 범위에 정의되어 있는지 확인할 수있는 유일한 방법 $GLOBALS은 신뢰할 수 없습니다 array_key_exists( 'var_name', get_defined_vars() ).


1
나는 그것이 다른 많은 사람들이 전에 말한 것이라고 생각합니까, 아니면 내가 틀렸습니까?
Stephan Vierkant

-1

a) 존재하고 b)가 null이 아닌 변수의 존재를 확인하는 가장 좋은 방법으로 비우기를 사용하지 않는 것이 좋습니다.

if (!empty($variable)) do_something();

2
empty()변수가 null인지 확인하지 않고 변수가 false인지 확인합니다 ""( 예 : (빈 문자열), 0(0은 정수), 0.0(0은 float), "0"(0은 문자열)) NULL, FALSE, array()(빈 배열) 및 $var;(값이 선언되지 않은 변수). 당신이 값으로 두 개의 입력을 가진 형태로 필요한 무선 필드가 있다고 가정 0하고 1. empty()유효성 검사에 사용 하고 사용자가이를 선택하면 0"필수 필드는 비워 둘 수 없습니다"라는 실수로 오류가 발생합니다. php.net/manual/en/function.empty.php
Halil Özgür
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.