Если вы сообщаете об ошибках или даже для лучшей практики, когда вы устанавливаете переменную в PHP, вы должны проверить, существует ли она в первую очередь (в этом случае она не всегда существует), а также отключить ее или просто отключить?
<?PHP if (isset($_SESSION['signup_errors'])){ unset($_SESSION['signup_errors']); } // OR unset($_SESSION['signup_errors']); ?>
Просто отключите его, если он не существует, ничего не будет сделано.
Из руководства PHP :
Что касается некоторой путаницы ранее в этих заметках о том, что вызывает unset (), чтобы вызывать уведомления при отключении переменных, которые не существуют ….
Отмена переменных, которые не существуют, как в
<?php unset($undefinedVariable); ?>
с<?php unset($undefinedVariable); ?>
не вызывает уведомление «Неопределенная переменная». Но
<?php unset($undefinedArray[$undefinedKey]); ?>
с<?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();
с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() { 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() { 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() { 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
Function B time = 0.72514510154724
Function C time = 1.3804969787598
Function D time = 0.86475610733032
Вывод:
Это всегда менее эффективно использовать 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($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($undefined_array)){ unset($undefined_array['undefined_element_key']); } if(isset($undefined_object)){ unset($undefined_object->undefined_prop_name); }
с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); }
сif(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
сif(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
сif(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
сif(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); }
При работе с объектами есть еще одна вещь, о которой нужно подумать, и это видимость.
Просто потому, что он существует, не означает, что у вас есть разрешение на его изменение.