Проверьте, существует ли var перед отключением в PHP?

С сообщением об ошибках или даже с лучшей практикой при отключении переменной в PHP вы должны проверить, существует ли она в первую очередь (в этом случае она не всегда существует), а также отключить ее или просто отключить?

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

// OR

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

Ответ 1

Просто отмените его, если он не существует, ничего не будет сделано.

Ответ 2

Из руководства PHP:

Что касается некоторой путаницы ранее в эти примечания о том, что вызывает unset() вызывать уведомления при отключении переменных, которые не существуют....

Отмена переменных, которые не существуют, как в

<?php
unset($undefinedVariable);
?>

не вызывает "Undefinedпеременное", но

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

вызывает два уведомления, так как это код для снятия элемента массив; ни $undefinedArray, ни $undefinedKey сами являются unset, они просто используются для найдите то, что должно быть отменено. После все, если бы они действительно существовали, вы все равно ожидайте, что они оба после этого. Вы НЕ хотите, чтобы ваши весь массив исчезнет только потому, что вы отключите() один из его элементов!

Ответ 3

Использование unset в переменной undefined не вызовет никаких ошибок (если только переменная не является индексом массива (или объекта), который не существует).

Поэтому единственное, что вам нужно учитывать, - это то, что наиболее эффективно. Более эффективно не тестировать "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();

Результаты:

  • Function A time = 1.0307259559631
    • Определено без isset
  • Function B time = 0.72514510154724
    • Undefined без isset
  • Function C time = 1.3804969787598
    • Определено с помощью isset
  • Function D time = 0.86475610733032
    • Undefined с помощью isset

Вывод:

Всегда менее эффективно использовать isset, не говоря уже о небольшом количестве дополнительного времени, которое требуется для записи. Быстрее попробовать unset переменную undefined, чем проверить, может ли она быть unset.

Ответ 4

Если вы хотите отключить переменную, вы можете просто использовать 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); 
}

Причина, по которой мы проверяем только переменную (родительскую), просто потому, что нам не нужно проверять свойство/элемент, и сделать это было бы намного медленнее, чтобы писать и вычислять, поскольку это добавило бы дополнительную проверку.

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

При работе с объектами есть еще одна вещь, о которой нужно думать, и это видимость.

Просто потому, что он существует, не означает, что у вас есть разрешение на его изменение.

Ответ 5

Проверьте эту ссылку https://3v4l.org/hPAto

Онлайн-инструмент показывает совместимость кода для разных версий PHP

Согласно этому инструменту код

unset($_SESSION['signup_errors']);

будет работать для PHP> = 5.4.0