Intereting Posts
Как я могу опубликовать многомерные данные JSON через Jquery.post? Подсказка типа Php не согласуется с интерфейсами и абстрактными классами? Ссылка: Почему мои «специальные» символы Unicode кодируются странно, используя json_encode? PHP Удаленная потоковая передача файлов с поддержкой возобновления XMPP для PHP (как это сделать) PHP htmlentities и сохранение данных в формате xml PHP & mySQL: когда именно использовать htmlentities? Правильный способ получить время веб-сервера и отобразить его на веб-страницах Срок действия php cURL истекает через 120308 миллисекунд при получении X из -1 байта Можно ли прогнозировать rand (0,10) в PHP? Переменные JavaScript Pass через ссылку Есть ли стандартный способ поменять запрос из идентификатора на другой столбец, например «имя»? Найти фактический тип данных в MySQLi Код, чтобы сообщить мне, если мой сайт был украден Сохранить удаленный img-файл на сервере, с php

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

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

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

Solutions Collecting From Web of "Проверьте, существует ли var перед отключением в PHP?"

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

Из руководства 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(); 

Результаты:

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

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

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