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

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

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

// OR

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



답변

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


답변

PHP 매뉴얼에서 :

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

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

<?php
unset($undefinedVariable);
?>

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

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

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


답변

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.


답변

변수 설정을 해제하려면 다음을 사용할 수 있습니다. 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);
}

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

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


답변

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

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

이 도구에 따르면 코드

unset($_SESSION['signup_errors']);

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


답변