developer tip

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

copycodes 2020. 10. 11. 10:47
반응형

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을 사용하여 정의되지 않음

결론:

It is always less efficient to use isset, not to mention the small amount of extra time it takes to write. It's quicker to attempt to unset an undefined variable than to check if it can be unset.


If you would like to unset a variable then you can just use unset

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

Checking for its existence has no benefit when trying to unset a variable.

If the variable is an array and you wish to unset an element you must make sure the parent exists first, this goes for object properties too.

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

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

This is easily solved by wrapping the unset in an if(isset($var)){ ... } block.

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

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

The reason we only check the variable(parent) is simply because we don't need to check the property/element and doing so would be a lot slower to write and compute as it would add an extra check.

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)){
...
}

This goes without saying but it is also crucial that you know the type of the variable when getting, setting and unsetting an element or property; using the wrong syntax will throw an error.

Its the same when trying to unset the value of a multidimensional array or object. You must make sure the parent key/name exists.

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

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

When dealing with objects there is another thing to think about, and thats visibility.

Just because it exists doesn't mean you have permission to modify it.


Check this link https://3v4l.org/hPAto

The online tool shows code compatibility for different versions of PHP

According to this tool the code

unset($_SESSION['signup_errors']);

would work for PHP >=5.4.0 without giving you any notices/warnings/errors.

참고URL : https://stackoverflow.com/questions/1374705/check-if-var-exist-before-unsetting-in-php

반응형