Проверьте, существует ли var перед сбросом в PHP?


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

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

// OR

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

4 ответа:

просто удалить его, если он не существует, ничего не поделаешь.

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

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

сбросить переменные, которые не существуют, как в

<?php
unset($undefinedVariable);
?>

не вызывает "неопределенный переменная " обратите внимание. Но

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

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

используя 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); 
}

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

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

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

.против

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

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

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