Проверьте, существует ли var перед сбросом в PHP?
с сообщением об ошибке или даже для лучшей практики, при сбросе переменной в PHP, вы должны проверить, существует ли она сначала (в этом случае она не всегда существует) и отменить ее или просто отменить ее?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
4 ответа:
в связи с некоторой путаницей ранее в эти заметки о том, что причины отключения() чтобы вызвать уведомления при отключении переменные, которые не существуют....
сбросить переменные, которые не существуют, как в
<?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();
результаты:
Function A time = 1.0307259559631
- определено без isset
Function B time = 0.72514510154724
- неопределенный без isset
Function C time = 1.3804969787598
- определяется с помощью isset
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); }
при работе с объектами есть еще одна вещь, о которой нужно думать, и это видимость.
только потому, что он существует, не означает, что у вас есть разрешение на его изменение.