PHP에서 설정을 해제하기 전에 var가 있는지 확인하십시오.


89

PHP에서 변수를 설정 해제 할 때 오류보고를 설정했거나 모범 사례를 위해 먼저 변수가 존재하는지 (이 경우 항상 존재하지는 않음) 확인하고 설정 해제해야합니까, 아니면 설정 해제해야합니까?

<?PHP
if (isset($_SESSION['signup_errors'])){
    unset($_SESSION['signup_errors']);
}

// OR

unset($_SESSION['signup_errors']);
?>


1
NOT사용하는 것이 더 효율적 isset입니다. 내 대답을 살펴보십시오. 속도 차이를 찾기 위해 테스트를 수행했습니다.
댄 브레이

답변:


171

설정을 해제하십시오. 존재하지 않으면 아무것도 수행되지 않습니다.


3
나는 그것이 경고 또는 통지를 던질 지 몰랐습니다
JasonDavis

20
@SilentGhost 동의합니다. 간단한 테스트처럼 보이지만 전문적인 조언을 요청하고 있으며 오류 로그에는 정의되지 않은 변수를 설정 해제하는 오류 / 경고 / 알림이 없을 수 있지만 기록되지 않은 다른 문제가있을 수 있습니다. 예를 들어 unset을 호출하는 것은 PHP가 아무것도 찾을 수 없기 때문에 모든 var 데이터를 검색하는 것을 의미하지만 using을 사용하면 if set더 나은 인덱싱 체계가있을 수 있습니다. (예를 들어, 이전 방법은 아마도 cobblers이며 두 접근 방식 모두 동일한 데이터 검사 방법을 사용합니다).
James

사실이며 더 효율적입니다. 사용 isset하지 않는 구절 을 사용하는 속도를 테스트했기 때문에 내 대답을 살펴보십시오 isset.
댄 브레이

투표 거절-정의되지 않은 배열 키를 설정 해제 할 수 없습니다.
Behnam

1
@jascha 내가 말했다, 우리는 할 수 없습니다!
Behnam

48

PHP 매뉴얼에서 :

존재하지 않는 변수를 설정 해제 할 때 unset ()이 알림을 트리거하는 원인에 대한이 노트의 앞부분에서 약간의 혼동과 관련하여 ....

존재하지 않는 변수 설정 해제

<?php
unset($undefinedVariable);
?>

"정의되지 않은 변수"알림을 트리거하지 않습니다. 그러나

<?php
unset($undefinedArray[$undefinedKey]);
?>

이 코드는 배열의 요소를 설정 해제하기위한 것이므로 두 개의 알림을 트리거합니다. $ undefinedArray 또는 $ undefinedKey 자체가 설정 해제되지 않고 설정 해제되어야하는 항목을 찾는 데 사용됩니다. 어쨌든 그들이 존재했다면, 둘 다 나중에 둘 다있을 것이라고 기대할 것입니다. 요소 중 하나를 unset ()했다고해서 전체 배열이 사라지는 것을 원하지 않습니다!


42
이것은 좀 더 설명이 필요합니다. 배열 자체가 존재하는 한 정의되지 않은 배열 키를 설정 해제 할 수 있습니다.
kingmaple

@kristovaher 실제로-이것은 OP가 설명하는 특정 시나리오를 전혀 다루지 않습니다.
Mark Amery 2014-04-02

22

unset정의되지 않은 변수에 사용하면 오류가 발생하지 않습니다 (변수가 존재하지 않는 배열 (또는 객체)의 인덱스가 아닌 경우).

따라서 고려해야 할 유일한 것은 가장 효율적인 것입니다. 내 테스트에서 볼 수 있듯이 'isset'으로 테스트하지 않는 것이 더 효율적입니다.

테스트:

function A()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($defined);
    }
}

function B()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($undefined);
    }
}

function C()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($defined))
            unset($defined);
    }
}

function D()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($undefined))
            unset($undefined);
    }
}

$time_pre = microtime(true);
A();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function A time = $exec_time ";

$time_pre = microtime(true);
B();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function B time = $exec_time ";

$time_pre = microtime(true);
C();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function C time = $exec_time ";

$time_pre = microtime(true);
D();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function D time = $exec_time";
exit();

결과 :

  1. Function A time = 1.0307259559631
    • isset없이 정의 됨
  2. Function B time = 0.72514510154724
    • isset없이 정의되지 않음
  3. Function C time = 1.3804969787598
    • isset을 사용하여 정의
  4. Function D time = 0.86475610733032
    • isset을 사용하여 정의되지 않음

결론:

isset작성하는 데 걸리는 약간의 추가 시간은 말할 것도없고 항상 사용하는 것이 덜 효율적 입니다. unset정의되지 않은 변수 를 시도하는 것이 가능한지 확인하는 것보다 더 빠릅니다 unset.


1
이것은 받아 들인 대답보다 훨씬 낫습니다! 이 테스트를 실행 해 주셔서 감사합니다.
Adam Friedman

3

변수 설정을 해제하려면 다음을 사용할 수 있습니다. unset

unset($any_variable); // bool, object, int, string etc

변수를 설정 해제하려고 할 때 그 존재를 확인하는 것은 아무런 이점이 없습니다.

변수가 배열이고 요소 설정을 해제하려면 먼저 부모 가 존재 하는지 확인해야합니다 . 이는 객체 속성에도 적용됩니다.

unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array

unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object

이것은 쉽게 배치함으로써 해결된다 unset에서 if(isset($var)){ ... }블록.

if(isset($undefined_array)){
    unset($undefined_array['undefined_element_key']); 
}

if(isset($undefined_object)){
    unset($undefined_object->undefined_prop_name); 
}

변수 ( parent ) 만 확인하는 이유 는 단순히 속성 / 요소를 확인할 필요가없고 추가 확인을 추가하기 때문에 작성 및 계산 속도가 훨씬 느리기 때문입니다.

if(isset($array)){
...
}

if(isset($object)){
...
}

.vs

$object->prop_name = null;
$array['element_key'] = null;

// This way elements/properties with the value of `null` can still be unset.

if(isset($array) && array_key_exists('element_key', $array)){
...
}

if(isset($object) && property_exists($object, 'prop_name')){
...
}

// or 

// This way elements/properties with `null` values wont be unset.

if(isset($array) && $array['element_key'])){
...
}

if(isset($object) && $object->prop_name)){
...
}

이것은 말할 것도없이 type요소 나 속성을 가져오고, 설정하고, 해제 할 때 변수에 대해 아는 것도 중요합니다 . 잘못된 구문을 사용하면 오류가 발생합니다.

다차원 배열이나 객체의 값을 설정 해제하려고 할 때도 마찬가지입니다. 상위 키 / 이름이 있는지 확인해야합니다.

if(isset($variable['undefined_key'])){
    unset($variable['undefined_key']['another_undefined_key']);
}

if(isset($variable->undefined_prop)){
    unset($variable->undefined_prop->another_undefined_prop);
}

물체를 다룰 때 고려해야 할 또 다른 것이 있습니다. 바로 가시성입니다.

존재한다고해서 수정할 수있는 권한이있는 것은 아닙니다.


마지막으로 올바른 대답입니다. 감사합니다.
wp78de

작은 업데이트 : PHP 7.4 / 8.0에서는 unset존재하지 않는 부모 개체의 속성에 오류가 발생하지 않습니다 . 그러나 PHP8에서 존재하지 않는 배열의 키를 불안정하게 만들면 알림뿐만 아니라 경고 (변경 될 수 있음)가 발생합니다.
wp78de

1

이 링크 확인 https://3v4l.org/hPAto

온라인 도구는 다양한 버전의 PHP에 대한 코드 호환성을 보여줍니다.

이 도구에 따르면 코드

unset($_SESSION['signup_errors']);

통지 / 경고 / 오류없이 PHP> = 5.4.0에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.