empty
28 января 2009
Один из гуру CakePHP сегодня довольно сильно удивил. У него нашёлся вот такой код:
if (isset($step['options']['merge']) && $step['options']['merge']) { // do stuff }
Чтобы не делать всех проверок он придумал сначала делать так:
$step['options'] = array('merge' => false) + $step['options']; if ($step['options']['merge']) { // do stuff }
а потом даже вот так:
if (@$step['options']['merge']) { // do stuff }
хотя можно было просто использовать empty:
if (!empty($step['options']['merge'])) { // do stuff }
Комментарии RSS по email OK
Насколько я понимаю задача стояла избавиться от предупреждений о неинициализованных переменных (выводится в лог ошибок).
В итоге он просто запретил вывод ошибок.
empty не избавляет от этой ошибки.
Из мануала:
empty() является противоположностью (boolean) var, за исключением того, что не появляется предупреждение, когда переменная не определена.
Прошу прощения, empty действительно не выводит предупреждение, если переменная не определена.
Почему-то в памяти отложилось, что можно использовать только isset.
Вариант с @ мне нравится как более универсальный вариант. В отличие от empty его можно запользовать для лаконичного сравнения не только с логическим true, а с чем угодно ('XMLHttpRequest' == @$_SERVER['HTTP_X_REQUESTED_WITH']). естественно, злоупотреблять не стоит.
Мне кстати не нравится в empty, что
0 (0 как целое число)
и
"0" (0 как строка)
считаются пустыми (((.
Можно конечно свою функцию написать, но всё же.
Я считаю, что использование оператора @ допустимо только в случаях с файловыми операциями, таких как filesize() и т.п.
В остальных же случаях чуть-чё это же будет просто ад для программера искать ошибку.