2010-09-17 4 views
2

Я включил error_reporting(E_ALL) и запустить этот код:Почему я должен проверить, существует ли массив, прежде чем пытаться получить к нему доступ?

$topic_id = (int) safe_query($_GET['top_id']); 

if($topic_id > 0) 
    include("topic.php"); 

И получить эту ошибку: Notice: Undefined index: top_id. Это так плохо, что я делаю? Если да, то почему? Должен ли я проверить, не пусто ли $_GET['top_id'], прежде чем я дам его значение $topic_id? Зачем? Спасибо.

ответ

4

Одна из причин, почему я делаю это, заключается в предотвращении неожиданного поведения.

Код должен всегда отражать намерение программиста. Если поведение зависит от какого-то загадочного процесса в фоновом режиме, то в конце концов он придет и укусит вас в задницу, когда вы будете глубоко в колене внутри ошибок и отладки.

Традиционно попытка доступа к массиву с отсутствующим ключом вызывает сбой (возможно, в неуправляемой среде) или ошибку. PHP тихо «фиксирует» это в фоновом режиме отлично подходит для новичков, но плохо для отладки. Ваш код будет работать, но может дать вам неожиданный результат.

Возьмем, к примеру, ваш код. Скажите, что вызывающая страница забудет указать top_id или пропустить ее как topid, а PHP продолжает веселиться. Он не включал topic.php, и ничего не происходит. Код работает нормально. PHP не жалуется. Что не так?

Теперь ваш код короткий. Что происходит, когда оно длиннее? Загрязнены глубоко внутри многих линий, между различными функциональными возможностями? Для вашего случая это не имеет большого значения, но при выполнении сложных манипуляций с массивами это усложнит процесс отладки.

0

Я понимаю вопрос сейчас. Я бы предложил использовать isset, чтобы быть в безопасности. Я предполагаю, что у вас нет topic_id, который равен 0.

+0

Потому что, если он не существует, он просто становится нулевым, и это нормально для меня. Это работает, так почему я должен его менять, вот что я прошу. –

0

Это не проблема, потому что вы принимаете на нее действие, только если оно установлено. Однако вам просто повезло, что значение unset равно false. Кроме того, было бы неприятно продолжать, если бы оно дало вам предупреждение. Вероятно, вам лучше всего подойдет то, что предложили другие, проверяя, установлен ли он перед его использованием. Может быть проще всего настроить функцию, которая делает это, особенно если вы собираетесь проверять множество параметров GET.

Независимо от того, что вы делаете, не просто поворачивайте уровень предупреждения вниз, чтобы подавить предупреждение; в этом случае нецелесообразно назначать из неустановленной переменной, но в будущем она может указывать на фактическую ошибку.

0

«И получить эту ошибку ... Это так плохо, что я делаю?»

Ну, это не дает вам Error. Это дает вам Notice. Замечания «проигнорированы» (то есть не отражены) на рабочих серверах.

По существу, PHP говорит вам, что Extrakun говорит в своем ответе. Вы должны принять уведомление к потенциальной ошибке, которая может привести к ошибке . позже.

Итак, «Это так плохо, что я делаю?» ... возможно, нет. Но, опять же, PHP также не дает вам ошибки. Это дает вам достаточное количество внимания, которое заслуживает сегмент кода - Notice.

Смежные вопросы