Ответ 1
Просто отмените его, если он не существует, ничего не будет сделано.
С сообщением об ошибках или даже с лучшей практикой при отключении переменной в PHP вы должны проверить, существует ли она в первую очередь (в этом случае она не всегда существует), а также отключить ее или просто отключить?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
Просто отмените его, если он не существует, ничего не будет сделано.
Что касается некоторой путаницы ранее в эти примечания о том, что вызывает unset() вызывать уведомления при отключении переменных, которые не существуют....
Отмена переменных, которые не существуют, как в
<?php unset($undefinedVariable); ?>
не вызывает "Undefinedпеременное", но
<?php unset($undefinedArray[$undefinedKey]); ?>
вызывает два уведомления, так как это код для снятия элемента массив; ни $undefinedArray, ни $undefinedKey сами являются unset, они просто используются для найдите то, что должно быть отменено. После все, если бы они действительно существовали, вы все равно ожидайте, что они оба после этого. Вы НЕ хотите, чтобы ваши весь массив исчезнет только потому, что вы отключите() один из его элементов!
Использование 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
Function B time = 0.72514510154724
Function C time = 1.3804969787598
Function D time = 0.86475610733032
Вывод:
Всегда менее эффективно использовать isset
, не говоря уже о небольшом количестве дополнительного времени, которое требуется для записи. Быстрее попробовать unset
переменную undefined, чем проверить, может ли она быть 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)){
...
}
.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);
}
При работе с объектами есть еще одна вещь, о которой нужно думать, и это видимость.
Просто потому, что он существует, не означает, что у вас есть разрешение на его изменение.
Проверьте эту ссылку https://3v4l.org/hPAto
Онлайн-инструмент показывает совместимость кода для разных версий PHP
Согласно этому инструменту код
unset($_SESSION['signup_errors']);
будет работать для PHP> = 5.4.0