С сообщением об ошибках или даже для лучшей практики при отключении переменной в PHP, следует ли вам сначала проверить, существует ли она (в этом случае она не всегда существует), и отключить ее, или просто отключить ее?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
NOT
использованииisset
. Посмотри на мой ответ. Я сделал тесты, чтобы найти разницу в скорости.Ответы:
Просто отключите его, если его нет, ничего не будет сделано.
источник
if set
может иметь лучшую схему индексации. (Просто пример, предыдущий, вероятно, сапожники, и оба подхода используют один и тот же метод проверки данных).isset
стихов, которые не используютсяisset
.Из Руководства по PHP :
источник
Использование
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
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
в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); }
Имея дело с объектами, есть еще одна вещь, о которой нужно думать, и это видимость.
Тот факт, что он существует, не означает, что у вас есть разрешение на его изменение.
источник
unset
используете свойство несуществующего родительского объекта. Однако при отключении ключа в несуществующем массиве в PHP8 возникает не только уведомление, но и предупреждение (которое может быть изменено).Проверьте эту ссылку https://3v4l.org/hPAto
Онлайн-инструмент показывает совместимость кода для разных версий PHP.
Согласно этому инструменту код
unset($_SESSION['signup_errors']);
будет работать для PHP> = 5.4.0 без каких-либо уведомлений / предупреждений / ошибок.
источник