На стеке потока я вижу эту проблему все время:
- E_NOTICE? == E_DEBUG, избегая isset () и @ с более изощренным обработчиком ошибок
- Как настроить PHP, чтобы он не проверял неопределенный индекс для $ _GET, когда E_NOTICE включен?
- Как остановить PHP от регистрации ошибок PHP Notice
- Как отключить такие уведомления PHP 5.3?
Даже Пекка (который предлагает множество полезных советов по PHP) натолкнулся на страшного E_NOTICE
монстра и надеется на лучшее решение, чем использование isset()
: isset () и empty () делают код уродливым
Лично я использую isset()
и empty()
во многих местах для управления потоком своих приложений. Например:
public function do_something($optional_parameter = NULL) {
if (!empty($optional_parameter)) {
// do optional stuff with the contents of $optional_parameter
}
// do mandatory stuff
}
Даже простой фрагмент вроде этого:
if (!isset($_REQUEST['form_var'])) {
// something's missing, do something about it.
}
кажется очень логичным для меня. Это не похоже на раздувание, это похоже на стабильный код. Но многие разработчики запускают свои приложения с E_NOTICE
включенным, обнаруживают множество разочаровывающих уведомлений о «неинициализированном индексе массива», а затем морщатся от перспективы проверки на наличие определенных переменных и «засорения» их кода isset()
.
Я предполагаю, что другие языки обрабатывают вещи по-другому. Судя по опыту, JavaScript не так вежлив, как PHP. Неопределенная переменная обычно останавливает выполнение скрипта. Кроме того (если говорить неопытно ), я уверен, что такие языки, как C / C ++, просто откажутся от компиляции.
Итак, разработчики PHP просто ленивы? (не говоря о вас, Пекка, я знаю, что вы рефакторинг старого приложения.) Или другие языки обрабатывают неопределенные переменные более изящно, чем требование программиста сначала проверить, определены ли они?
(Я знаю, что есть и другие E_NOTICE
сообщения, помимо неопределенных переменных, но, похоже, именно они вызывают наибольшее огорчение)
Приложение
Из ответов до сих пор, я не единственный, кто думает, что isset()
это не блат кода. Итак, мне интересно, есть ли проблемы с программистами на других языках, которые повторяют этот? Или это исключительно вопрос культуры PHP?
источник
Ответы:
Я пишу код
E_STRICT
и ничего больше.Использование пустых проверок и проверок isset не делает ваш код уродливым, он делает ваш код более многословным. На мой взгляд, что самое худшее, что может случиться с их использованием? Я набираю еще несколько символов.
Стихи о последствиях неиспользования их, как минимум предупреждений.
источник
E_STRICT
. Я подавляю все ошибки в производстве, но это только для того, чтобы ничто не ускользнуло от меня в процессе разработки.E_STRICT
. Напишите код и устраните все предупреждения и ошибки.Я думаю, что уведомления о неизвестных элементах являются ошибкой дизайна в PHP. Я не уверен, что сейчас можно исправить ошибку, но она генерирует много стандартного кода, как
if(isset($foo['abc']) && $foo['abc'] == '123')
- этот код не должен иметьisset
, поскольку цель состоит в том, чтобы проверить, есть ли «123» в определенном месте,$foo
и если там ничего нет, это определенно не «123». Единственная причина, по которой вам приходится писать вдвое больше кода, это из-за этой неудачной ошибки проектирования в PHP. К сожалению, уведомления в PHP очень дороги, поэтому просто отключить их нельзя для кода, где важна производительность.Так что да, это делает код уродливым ИМХО, и это меня раздражает. И это не из-за отсутствия опыта - я использую PHP с 1998 года, и я помню, когда было
.php3
расширение, и это означало «это не PHP 2». Может быть, я ленивый :) Но лень - по крайней мере, определенный тип - это добродетель для программиста.С другой стороны, допустимое использование
isset
иempty
- как и в оригинальном посте - хорошо. Я просто думаю, что PHP чрезмерно усердствует в отношении предупреждений в тех местах, гдеisset/empty
они на самом деле не нужны.источник
$eg = isset($_GET['eg'])? $_GET['eg'] : null;
смешно многословно. Я действительно хотел бы, чтобы был еще один оператор, который не был «подавлением ошибок» как таковой, чтобы заменить краткий смысл$eg = @$_GET['eg'];
«принять-не-существование-этого-массива-ключа-как-ноль». В эти дни я склонен использовать короткую функцию.$eg = $_GET['eg'] ?? null;
$eg = @$_GET['eg'] ?: null;
. Я обычно не использую его, но в этом случае мы явно ожидаем эту ошибку и решаем игнорировать ее. Он на один символ длиннее, чем null coalesce, и он не так хорош (он подавляет все ошибки, и, возможно, ArrayAccess делает там что-то интересное, а не только массив), но в целом он выполняет свою работу.Я полагаю, что PHP, как свободный язык, который интерпретируется и используется в Интернете, имеет очень высокую долю непрофессиональных, неподготовленных программистов, которые не до конца понимают, почему они должны защищаться, и просто рассматривают предупреждения как еще одну ненужную ошибку. ,
Я постоянно слышу эти замечания от начинающих разработчиков и сценаристов-самоучек:
Если они никогда не сталкивались с языком со строгой типизацией и не сталкивались с ошибками необъявленных / необоснованных переменных, то им нужно что-то убедительное. Я обнаружил, что они обычно сдаются, как только час или около того испытывают удовольствие от отладки кода и обнаруживают, что это была опечатка в имени переменной, вызывающая проблему.
Другим важным фактором является использование PHP в веб-индустрии, которая, как правило, гораздо больше заботится о пропускной способности, чем о безопасности и качестве кода.
источник
Да, они ленивы. В любом случае их много ...
К сожалению, менталитет многих PHP-программистов таков: «Нет смысла защищать код, если вы можете получить тот же конечный результат быстрее, полагаясь на язык для обработки ошибок, вызванных отсутствием переменных и т. Д.» Я знаю, я работал с несколькими из них.
Как правило, именно они загадочно отправляются на ранний ланч, когда из-за отсутствия правильной обработки ошибок и создания отчетов работающие серверы вынимаются на несколько часов ...
источник
Я стараюсь избегать использования isset () и empty (), избегая использования массивов в качестве объектов передачи данных. Создайте класс, который можно настроить для принятия ограниченного набора свойств со стандартными значениями по умолчанию, и проверьте входные данные для этих свойств. Он может даже реализовать интерфейс ArrayAccess, чтобы вы могли использовать его как массив. Это также позволяет вам использовать подсказки типов в сигнатурах вашего метода, чтобы перехватывать ошибки, когда кто-то пытается передать неправильный тип сущности вашему методу.
источник
Многие разработчики ошибочно принимают наличие большого количества
isset()
как знак качества. Это создает впечатление надежности, и некоторые люди думают об этом даже как о функции безопасности.Но вы должны принять во внимание, что PHP не является компилируемым языком. Это язык сценариев с динамической системой типов. Ошибки E_NOTICE - это только ошибки по имени. И если многие из
isset
них используются с единственной целью подавления уведомлений, то вы фактически просто программируете против языка .Это действительно так, если вы видите множество уведомлений и предупреждений. Многие новички не заботятся об уведомлениях, и это, как правило, результат полностью отключен
error_reporting(0)
.Однако вы ошибаетесь, что другие разработчики не распознали E_NOTICE только потому, что они не были @ или isset-suppressed. По крайней мере, это было мое намерение за вопросом о сохранении уведомлений . Это не то, от чего нужно избавляться, а иногда важная отладочная информация.
Как и все обобщения, неосторожное использование isset не приводит к оптимальному коду. Важно различать, где
isset
и гдеempty
необходимо, а где - синтаксическая соль .Нет, неопределенная переменная «ошибки» - не проблема PHP. Bash, TCL и Perl или JavaScript позволяют использовать неопределенные переменные. Однако эта имманентная языковая особенность не рассматривается как недостаток. Существуют похожие языковые конструкции для проверки неопределенных значений. Однако они не так часто используются, как в PHP, поскольку значения undef не ошибочно характеризуются как «ошибка».
источник
Интересный. Я почти никогда не использую isset (). Мой PHP-код редко находится в состоянии, когда я не знаю, была ли переменная установлена в первую очередь. Доступ к каждой используемой переменной GET или POST осуществляется через функцию, которая обеспечивает ее по умолчанию, если она не существует. Значения по умолчанию в вызовах функций обычно явно равны 0 или пустым строкам.
источник
Я использую isset и пустое множество. Но в основном это те места, которые вы упоминаете, например, обработка $ _REQUEST, на случай, если кто-то возится с параметрами. В случаях, когда у меня есть контроль над всеми переменными, я нахожу, что они мне обычно не нужны.
источник
Я не люблю использовать isset, но если есть масса кода, сделанная другим, то это может быть спасительной грацией. Я написал приведенный ниже код, чтобы помочь с этой проблемой, вместо использования isset () isseter ($ a, $ b) вернет $ b, если $ a не определено или пусто, или функция возвращает ноль. Любые улучшения, добро пожаловать:
источник