Пишем PHP код, устойчивый к ошибкам PHP


Оглавление (нажмите, чтобы открыть):

Учимся писать безопасный код на PHP

Для тех, кто хоть как-то касался темы безопасности, знают, что защита информации – это непрекращающийся процесс. Он должен обеспечивать в отношении информации:

  • доступность;
  • целостность;
  • конфиденциальность.

Мне в университете вдалбливали это в голову на протяжении всех пяти лет обучения =)

Продолжение урока будет доступно вам
после покупки курса PHP для профессионалов

Как мне получить ошибки PHP?

Я проверил мой файл инициализации PHP ( php.ini ) и установил display_errors , а также отчет об ошибках E_ALL . Я перезапустил свой веб-сервер Apache.

Я даже поместил эти строки в начало моего скрипта, и он даже не ловит простые ошибки разбора. Например, я объявляю переменные с «$» и не закрываю операторы «;» . Но все мои сценарии показывают пустую страницу с этими ошибками, но я хочу видеть ошибки в выводе моего браузера.

Что осталось сделать?

Это всегда работает для меня:

Однако это не заставляет PHP отображать ошибки синтаксического анализа — единственный способ показать эти ошибки — изменить ваш php.ini с помощью следующей строки:

(если у вас нет доступа к php.ini , то помещение этой строки в .htaccess также может работать):

Вы не можете улавливать ошибки синтаксического анализа при включении вывода ошибок во время выполнения, поскольку он анализирует файл до фактического выполнения чего-либо (и поскольку во время этого он сталкивается с ошибкой, он ничего не выполнит). Вам нужно будет изменить фактическую конфигурацию сервера, чтобы display_errors был включен, и использовался соответствующий уровень error_reporting. Если у вас нет доступа к php.ini, вы можете использовать .htaccess или подобное, в зависимости от сервера.

Этот вопрос может предоставить дополнительную информацию.

Внутри php.ini:

Затем перезапустите веб-сервер.

Чтобы отобразить все ошибки, вам необходимо:

1. Возьмите эти строки в скрипте PHP, который вы вызываете из браузера (обычно index.php ):

2. (a) Убедитесь, что этот скрипт не имеет синтаксических ошибок

2. (b) Установите display_errors = On в свой php.ini

В противном случае он не может даже запустить эти 2 строки!

Вы можете проверить наличие синтаксических ошибок в вашем скрипте, выполнив (в командной строке):

Если вы включите скрипт из другого скрипта PHP, он отобразит синтаксические ошибки во включенном скрипте. Например:

index.php

my_script.php

Некоторые провайдеры веб-хостинга позволяют изменять параметры PHP в файле .htaccess .

Вы можете добавить следующую строку:

У меня была та же проблема, что и у вас, и это решение исправило ее.

Вы можете обнаружить, что все настройки для «сообщений об ошибках» или «ошибок отображения», похоже, не работают в PHP 7. Это связано с тем, что обработка ошибок изменилась. Вместо этого попробуйте:

Или, чтобы перехватывать исключения и ошибки за один раз (это не обратно совместимо с PHP 5):

Это будет работать:

Это лучший способ записать его, но синтаксическая ошибка дает пустой вывод, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отладки PHP-кода — использовать консоль; выполните следующие действия:

Установите это в вашем файле index.php:

Создайте файл с именем php.ini в папке, где находится ваш PHP файл.

Внутри php.ini добавьте следующий код (я даю простую ошибку, показывающую код):

Вот сценарий PHP:

Для более подробного объяснения ошибок PHP посетите PHP Error — error_reporting().

Если, несмотря на все приведенные выше ответы (или вы не можете отредактировать файл php.ini), вы все равно не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который будет включать отчет об ошибках, а затем включить файл проблемы. например:

Несмотря на то, что все правильно установлено в моем файле php.ini , это был единственный способ поймать ошибку пространства имен. Мой точный сценарий:

При использовании PHP в качестве модуля Apache мы можем изменить параметры конфигурации с помощью директив в файлах конфигурации Apache (например, httpd.conf) и .htaccess. Для этого вам понадобятся «AllowOverride Options» или «AllowOverride All».

Обычно я использую следующий код в моих простых проектах PHP.

Поскольку мы сейчас работаем с PHP 7, приведенные здесь ответы больше не верны. Единственный, который все еще в порядке, — это тот, что говорит Фрэнк Форте, когда он говорит о PHP 7

С другой стороны, вместо того, чтобы пытаться ловить ошибки с помощью try/catch, вы можете использовать хитрость: используйте include.

Вот три куска кода:

Запуск этого в PHP 7 ничего не покажет.

Теперь попробуйте это:

Теперь запустите tst2, который устанавливает отчеты об ошибках, а затем включите tst3. Ты увидишь:

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла, ожидаемая переменная (T_VARIABLE) или $ <(T_DOLLAR_OPEN_CURLY_BRACES) или <$ (T_CURLY_OPEN) в tst3.php в строке 4

Если вы каким-то образом окажетесь в ситуации, когда вы не можете модифицировать настройку с помощью php.ini или .htaccess , вам не повезло для отображения ошибок, когда ваши скрипты PHP содержат ошибки синтаксического анализа. Затем вам нужно будет разрешить лить файлы в командной строке следующим образом:

Если ваш хост заблокирован, что он не позволяет изменять значение через php.ini или .htaccess , он также может запретить изменение значения через ini_set . Вы можете проверить это со следующим PHP скрипт:

Вы можете сделать что-то вроде ниже:

Установите следующие параметры в вашем главном индексном файле:

Затем на основе ваших требований вы можете выбрать, что вы хотите показать:

Для всех ошибок, предупреждений и уведомлений:

Для всех ошибок:

Для всех предупреждений:

Для всех уведомлений:

Для получения дополнительной информации, проверьте здесь.

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

E_DEPRECATED); register_shutdown_function(«shutdownFunction»); set_exception_handler(«EXC_HANDLER»);

Лучшее/простое/быстрое решение, которое вы можете использовать, если это быстрая отладка, — это окружить ваш код перехватом исключений. Это то, что я делаю, когда хочу проверить что-то быстрое в производстве.

Этот код сверху должен работать:

Однако попробуйте отредактировать код на телефоне в файле:

Вот чему я научился. В файле PHP.INI

Пока ваш сайт работает, в файле php.ini по соображениям безопасности должен быть отключен display_errors. Однако для среды разработки display_errors можно включить для устранения неполадок.

Вы можете сделать это, изменив файл php.ini и добавив следующее

ИЛИ вы также можете использовать следующий код, так как это всегда работает для меня

Если у вас установлен Xdebug, вы можете переопределить все настройки, установив:

Тип: int, Значение по умолчанию: 0, Введено в Xdebug> = 2.3. Если для этого параметра установлено значение 1, ошибки будут отображаться всегда, независимо от значения PHP display_errors.

Вывод ошибок разных уровней в PHP

PHP — это достаточно свободный язык программирования, и это, на мой взгляд, большой минус. Главным недостатком здесь является то, что некоторые конструкции, которые в других языках сразу же отключат выполнение программы, в PHP является нормой и вполне допустимыми. Но если Вы хотите писать код изначально грамотно, то Вам необходимо знать о том, как выводить ошибки разных уровней.

В PHP есть несколько уровней ошибок, которые представлены в таблице ниже:

E_WARNING Различного рода предупреждения. Например, если функция требует 3 параметра, а Вы передаёте только 2, то будет как раз ошибка уровня E_WARNING.
E_NOTICE Примерно то же самое, что и E_WARNING, но ошибки это очень мелкие, и они лишь могут стать причиной ошибок в будущем. Пример: использование неинициализированной переменной. Могу сказать, что данный уровень ошибок встречается практически в каждом мало-мальски сложном скрипте.
E_DEPRECATED Данный уровень ошибок возникает при использовании устаревших конструкций, например, при вызове какой-нибудь старой функции.
E_PARSE Ошибка синтаксического характера. Например, забыли поставить круглую скобку.
E_ERROR Ошибка, которая нам хорошо знакома. Как правило, мы её видем чаще всего. Самый простой пример — это вызов несуществующей функции.
E_ALL Все ошибки.

На большинстве серверов стоит вывод ошибок уровня E_WARNING, E_PARSE и E_ERROR. То есть очень грубые замечания и фатальные ошибки. Если Вы хотите программировать профессионально, то контроль только таких ошибок не достаточен.

Я рекомендую на этапе создания проекта включать вывод уровня ошибок E_ALL. Сделать это очень просто:

И так нужно писать перед началом каждого скрипта. Если данный способ сильно не удобен, и Вы имеете доступ к php.ini, то в этом файле найдите директиву error_reporting и поставьте у неё значение E_ALL.

Если Вы с выводом такого уровня ошибок в PHP напишите код без единого замечания, то, значит, Вы создали, как минимум, неплохой продукт. Когда будете выкладывать уже на хостинг, то рекомендую данный уровень ошибок стереть, чтобы они не появлялись время от времени. Ведь PHP тоже обновляется и сегодня новые конструкции завтра могут уже устареть. И чтобы не вызывать ошибку уровня E_DEPRECATED, рекомендую отключать отображение подобных ошибок.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 5 ):

    Отличная статья! Давно искал толковое объяснение. Спасибо.

    Оформление кода PHP: стандарты и правила

    Восемь общих правил

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

    1. Придумывайте понятные и читаемые названия. Избегайте русских слов в латинской транскрипции. Только английские слова, обозначающие суть.
    2. Делайте отступы на каждом уровне и отделяйте логические блоки пустой строкой.
    3. Сокращайте вложенность кода и убирайте дублирование.
    4. Контролируйте длину. Рекомендуем для функций не более 20 строк, для метода не более 50 строк, для класса не более 300 строк, для файла — не более 1000 строк. Также ограничивайте длину одной строки до видимого значения на экране. Мягкое ограничение составляет 120 символов.
    5. Комментируйте и документируйте код. Это позволит зафиксировать всю необходимую информацию.
    6. Используйте рефакторинг. Следуйте принципу «рефакторинг — раньше и рефакторинг — чаще». Советуем также прочитать книгу «Рефакторинг. Улучшение проекта существующего кода» Мартина Фаулера.
    7. Работайте в системе контроля версий, например, Git. Это бесплатно и удобно. Обучиться работать в ней можно за 11 занятий на видеокурсе «Git. Быстрый старт».
    8. Изучайте Open Source код. Вы сможете увидеть, как пишут ведущие разработчики и воспользоваться лучшими практиками в программировании.


    Правила кода PHP

    На конец 2020 г. действуют стандарты PHP программирования: PSR-2 и PSR-1. Они устанавливают правила синтаксиса, именования, оформления. Весь код должен быть написан единообразно. Это касается пробелов, отступов, скобок, строк.

    Чтобы не запоминать все требования стандартов, можно работать в современной среде разработки — PhpStorm, NetBeans и подобных. Они позволяют автоматически форматировать текст в соответствии с правилами.

    Отступы

    Правильное оформление кода PHP предполагает его простое визуальное восприятие. Оно достигается с помощью отступов и пробелов. Для формирования отступов используйте пробелы, а не знак табуляции. Каждую строку начинайте с четырех пробелов. Код должен идти лесенкой: раскрываться вправо, затем собираться обратно.

    Запомните: один отступ = четыре пробела.

    Выделяем отступами тело конструкции, тело метода, блоки импорта, аргументы и подобное.

    Правильно

    Неправильно

    Пробелы

    • между for ( foreach/ while / catch) и (
    • после ;
    • между ) и <
    • перед =>
    • после =>
    • между try и <
    • между > и catch
    1. После имени метода.
    2. В списке аргументов перед запятыми.
    3. Между ( и именем функции или метода.

    Пустая строка

    1. После каждого логического блока.
    2. После определения пространства имен.
    3. После блока импорта. Каждая строка блока должна начинаться с use.

    Правильно

    Неправильно

    Круглые скобки

    1. Не выносим на отдельные строки.
    2. Не ставим пробелы внутри: после ( и перед ).
    3. Ставим пробелы до скобок и после.
    4. Внутри перечисление отделяем пробелами.

    Фигурные скобки

    1. Открывающая фигурная скобка выносится на новую строку перед телом метода, для классов.
    2. Открывающая фигурная скобка не выносится на отдельную строку в конструкциях и замыканиях.
    3. Закрывающая скобка > в конструкциях, имени метода, определении метода, классах пишется с новой строки и отделяется одним отступом.

    Аргументы

    Оформляются двумя способами: в одну строку через запятую или в столбик. Аргументы на одной строке пишутся через запятую внутри круглых скобок. Пробел ставится только после запятой.

    Правильно

    Неправильно

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

    Правильно

    Неправильно

    Конструкция switch case

    Конструкцию делим на три уровня: switch, case, echo/break. Каждый уровень начинается с отступа. Таким образом, наш код визуально выглядит состоящим из трех столбцов.

    Если в конструкции не используется break, поставьте // no break.

    Правильно

    Неправильно

    Конструкция try catch

    Тело try и тело catch отделяются одним отступом. Пробелы нужно поставить:

    • между try и <
    • между > и catch
    • между catch и (
    • между ) и <

    Catch и скобку > ставим на одну строку.

    Правильно

    Неправильно

    Конструкция if, elseif, else

    Операторы и открывающую фигурную скобку пишем на одной строке. Закрывающую фигурную скобку оператора пишем на той же строке, что и оператор. Заключительную фигурную скобку пишем на отдельной строке. Оператор else if пишем как единое слово — elseif. Тело оператора отделяем отступом.

    Правильно

    Неправильно

    Комментарии в коде

    Чистый код должен быть правильно закомментирован. К сожалению, встречаются две крайности: подробное комментирование каждой строки и полное отсутствие комментариев. И то, и другое мешает в работе. Избыточное комментирование снижает восприятие кода, отвлекает от понимания его сути. Писать очевидные вещи — тратить свое и чужое время. Иногда из-за слишком подробных комментариев объем кода увеличивается в несколько раз. Закончив с кодом, посмотрите критически. Очевидные и банальные комментарии удалите.

    Обратная сторона медали — отсутствие пояснений. Коды со сложной архитектурой, скриптами, с большой вложенностью требуют пометок. В этом случае комментарии помогут быстро ориентироваться в коде другим членам команды. Часто они помогают и самому разработчику кода. Главное — придерживаться золотой середины и комментировать только важные моменты.

    Больше информации о комментариях вы найдете в статье «Почему комментарии в коде — зло». А если вы считаете, что код — не место для шуток, предлагаю подборку самых забавных комментариев программистов.

    Чек-лист «Инспекция кода»

    Предлагаем чек-лист для самостоятельной проверки чистоты кода. Если вы будете инспектировать чужой код, помните, что программист — творческая профессия. А творческие люди обычно тяжело воспринимают критику. Будьте лояльней.

    • Легко ли воспринимать код визуально?
    • Присутствуют ли комментарии? насколько они необходимы?
    • Соответствует ли код стандартам PSR-1 и PSR-2? Краткая выжимка стандартов приведена в разделе “Правила кода PHP”.
    • Используете ли вы систему документирования phpDoc или подобную?
    • Нужно ли делать перерыв в чтении, чтобы разобраться в написанном?
    • Проведен ли рефакторинг?
    • Есть ли дублирование в блоках, функциях и пр.?
    • Понятны ли названия переменных, имена методов и пр.?
    • Какова длина строк, методов, функций, классов, файла?
    • Вы искали ошибки и баги?
    • Как можно еще улучшить код?
    • Можно ли сделать его короче?
    • Можно ли сделать его эффективней?

    Желательно провести тестирование. Руководствуйтесь тремя принципами:

    1. Тесты должны быть полными.
    2. Тесты должны соответствовать установленным требованиям.
    3. Тесты должны проводиться на нужном уровне тестирования.

    Дополнительную информацию по тестированию вы найдете в материале «Тестирование кода для чайников».

    Заключение

    Код — это не личный захламленный ящик с грудой бумаг. Правильный код — это картотека в Ленинской библиотеке. В нем все структурировано, задокументирована важная информация, есть связи с другими каталогами и библиотеками. Чистый код может разобрать и профи, и начинающий программист. С ним приятно работать, он характеризует уровень мастерства своего разработчика.

    Старайтесь следовать принятым правилам, рекомендациям и стандартам. Думайте о тех, кто будет работать с ним после вас. Всегда пробуйте сделать код короче и эффективней. Напишите так, чтобы это понимал не только Бог.

    Следование единым правилам упрощает работу программистов. Оформление кода PHP по одному стандарту помогает в командной работе и повышает уровень разработки. Понятие «качественный код» появилось не случайно, так же, как и анекдоты о неспособности спустя время прочитать даже собственный код. Понятный структурированный код сокращает время чтения, позволяет сразу приступить к поиску проблемы.

    Восемь общих правил

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

    1. Придумывайте понятные и читаемые названия. Избегайте русских слов в латинской транскрипции. Только английские слова, обозначающие суть.
    2. Делайте отступы на каждом уровне и отделяйте логические блоки пустой строкой.
    3. Сокращайте вложенность кода и убирайте дублирование.
    4. Контролируйте длину. Рекомендуем для функций не более 20 строк, для метода не более 50 строк, для класса не более 300 строк, для файла — не более 1000 строк. Также ограничивайте длину одной строки до видимого значения на экране. Мягкое ограничение составляет 120 символов.
    5. Комментируйте и документируйте код. Это позволит зафиксировать всю необходимую информацию.
    6. Используйте рефакторинг. Следуйте принципу «рефакторинг — раньше и рефакторинг — чаще». Советуем также прочитать книгу «Рефакторинг. Улучшение проекта существующего кода» Мартина Фаулера.
    7. Работайте в системе контроля версий, например, Git. Это бесплатно и удобно. Обучиться работать в ней можно за 11 занятий на видеокурсе «Git. Быстрый старт».
    8. Изучайте Open Source код. Вы сможете увидеть, как пишут ведущие разработчики и воспользоваться лучшими практиками в программировании.

    Правила кода PHP

    На конец 2020 г. действуют стандарты PHP программирования: PSR-2 и PSR-1. Они устанавливают правила синтаксиса, именования, оформления. Весь код должен быть написан единообразно. Это касается пробелов, отступов, скобок, строк.

    Мастер Йода рекомендует:  Создаем шаблоны электронных писем с помощью XML

    Чтобы не запоминать все требования стандартов, можно работать в современной среде разработки — PhpStorm, NetBeans и подобных. Они позволяют автоматически форматировать текст в соответствии с правилами.

    Отступы

    Правильное оформление кода PHP предполагает его простое визуальное восприятие. Оно достигается с помощью отступов и пробелов. Для формирования отступов используйте пробелы, а не знак табуляции. Каждую строку начинайте с четырех пробелов. Код должен идти лесенкой: раскрываться вправо, затем собираться обратно.

    Запомните: один отступ = четыре пробела.

    Выделяем отступами тело конструкции, тело метода, блоки импорта, аргументы и подобное.

    Правильно

    Неправильно

    Пробелы

    • между for ( foreach/ while / catch) и (
    • после ;
    • между ) и <
    • перед =>
    • после =>
    • между try и <
    • между > и catch
    1. После имени метода.
    2. В списке аргументов перед запятыми.
    3. Между ( и именем функции или метода.

    Пустая строка

    1. После каждого логического блока.
    2. После определения пространства имен.
    3. После блока импорта. Каждая строка блока должна начинаться с use.

    Правильно

    Неправильно

    Круглые скобки


    1. Не выносим на отдельные строки.
    2. Не ставим пробелы внутри: после ( и перед ).
    3. Ставим пробелы до скобок и после.
    4. Внутри перечисление отделяем пробелами.

    Фигурные скобки

    1. Открывающая фигурная скобка выносится на новую строку перед телом метода, для классов.
    2. Открывающая фигурная скобка не выносится на отдельную строку в конструкциях и замыканиях.
    3. Закрывающая скобка > в конструкциях, имени метода, определении метода, классах пишется с новой строки и отделяется одним отступом.

    Аргументы

    Оформляются двумя способами: в одну строку через запятую или в столбик. Аргументы на одной строке пишутся через запятую внутри круглых скобок. Пробел ставится только после запятой.

    Правильно

    Неправильно

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

    Правильно

    Неправильно

    Конструкция switch case

    Конструкцию делим на три уровня: switch, case, echo/break. Каждый уровень начинается с отступа. Таким образом, наш код визуально выглядит состоящим из трех столбцов.

    Если в конструкции не используется break, поставьте // no break.

    Правильно

    Неправильно

    Конструкция try catch

    Тело try и тело catch отделяются одним отступом. Пробелы нужно поставить:

    • между try и <
    • между > и catch
    • между catch и (
    • между ) и <

    Catch и скобку > ставим на одну строку.

    Правильно

    Неправильно

    Конструкция if, elseif, else

    Операторы и открывающую фигурную скобку пишем на одной строке. Закрывающую фигурную скобку оператора пишем на той же строке, что и оператор. Заключительную фигурную скобку пишем на отдельной строке. Оператор else if пишем как единое слово — elseif. Тело оператора отделяем отступом.

    Правильно

    Неправильно

    Комментарии в коде

    Чистый код должен быть правильно закомментирован. К сожалению, встречаются две крайности: подробное комментирование каждой строки и полное отсутствие комментариев. И то, и другое мешает в работе. Избыточное комментирование снижает восприятие кода, отвлекает от понимания его сути. Писать очевидные вещи — тратить свое и чужое время. Иногда из-за слишком подробных комментариев объем кода увеличивается в несколько раз. Закончив с кодом, посмотрите критически. Очевидные и банальные комментарии удалите.

    Обратная сторона медали — отсутствие пояснений. Коды со сложной архитектурой, скриптами, с большой вложенностью требуют пометок. В этом случае комментарии помогут быстро ориентироваться в коде другим членам команды. Часто они помогают и самому разработчику кода. Главное — придерживаться золотой середины и комментировать только важные моменты.

    Больше информации о комментариях вы найдете в статье «Почему комментарии в коде — зло». А если вы считаете, что код — не место для шуток, предлагаю подборку самых забавных комментариев программистов.

    Чек-лист «Инспекция кода»

    Предлагаем чек-лист для самостоятельной проверки чистоты кода. Если вы будете инспектировать чужой код, помните, что программист — творческая профессия. А творческие люди обычно тяжело воспринимают критику. Будьте лояльней.

    • Легко ли воспринимать код визуально?
    • Присутствуют ли комментарии? насколько они необходимы?
    • Соответствует ли код стандартам PSR-1 и PSR-2? Краткая выжимка стандартов приведена в разделе “Правила кода PHP”.
    • Используете ли вы систему документирования phpDoc или подобную?
    • Нужно ли делать перерыв в чтении, чтобы разобраться в написанном?
    • Проведен ли рефакторинг?
    • Есть ли дублирование в блоках, функциях и пр.?
    • Понятны ли названия переменных, имена методов и пр.?
    • Какова длина строк, методов, функций, классов, файла?
    • Вы искали ошибки и баги?
    • Как можно еще улучшить код?
    • Можно ли сделать его короче?
    • Можно ли сделать его эффективней?

    Желательно провести тестирование. Руководствуйтесь тремя принципами:

    1. Тесты должны быть полными.
    2. Тесты должны соответствовать установленным требованиям.
    3. Тесты должны проводиться на нужном уровне тестирования.

    Дополнительную информацию по тестированию вы найдете в материале «Тестирование кода для чайников».

    Заключение

    Код — это не личный захламленный ящик с грудой бумаг. Правильный код — это картотека в Ленинской библиотеке. В нем все структурировано, задокументирована важная информация, есть связи с другими каталогами и библиотеками. Чистый код может разобрать и профи, и начинающий программист. С ним приятно работать, он характеризует уровень мастерства своего разработчика.

    Старайтесь следовать принятым правилам, рекомендациям и стандартам. Думайте о тех, кто будет работать с ним после вас. Всегда пробуйте сделать код короче и эффективней. Напишите так, чтобы это понимал не только Бог.

    Пишем PHP код, устойчивый к ошибкам PHP

    I was confused as to what the @ symbol actually does, and after a few experiments have concluded the following:

    * the error handler that is set gets called regardless of what level the error reporting is set on, or whether the statement is preceeded with @

    * it is up to the error handler to impart some meaning on the different error levels. You could make your custom error handler echo all errors, even if error reporting is set to NONE.

    * so what does the @ operator do? It temporarily sets the error reporting level to 0 for that line. If that line triggers an error, the error handler will still be called, but it will be called with an error level of 0

    Hope this helps someone

    Be aware of using error control operator in statements before include() like this:

    (@include( «file.php» ))
    OR die( «Could not find file.php!» );

    ?>

    This cause, that error reporting level is set to zero also for the included file. So if there are some errors in the included file, they will be not displayed.

    If you’re wondering what the performance impact of using the @ operator is, consider this example. Here, the second script (using the @ operator) takes 1.75x as long to execute. almost double the time of the first script.

    So while yes, there is some overhead, per iteration, we see that the @ operator added only .005 ms per call. Not reason enough, imho, to avoid using the @ operator.

    function x () < >
    for ( $i = 0 ; $i 1000000 ; $i ++) < x (); >
    ?>

    real 0m7.617s
    user 0m6.788s
    sys 0m0.792s

    function x () < >
    for ( $i = 0 ; $i 1000000 ; $i ++) < @ x (); >
    ?>

    real 0m13.333s
    user 0m12.437s
    sys 0m0.836s

    Error suppression should be avoided if possible as it doesn’t just suppress the error that you are trying to stop, but will also suppress errors that you didn’t predict would ever occur. This will make debugging a nightmare.

    It is far better to test for the condition that you know will cause an error before preceding to run the code. This way only the error that you know about will be suppressed and not all future errors associated with that piece of code.

    There may be a good reason for using outright error suppression in favor of the method I have suggested, however in the many years I’ve spent programming web apps I’ve yet to come across a situation where it was a good solution. The examples given on this manual page are certainly not situations where the error control operator should be used.

    There is no reason to NOT use something just because «it can be misused». You could as well say «unlink is evil, you can delete files with it so don’t ever use unlink».

    It’s a valid point that the @ operator hides all errors — so my rule of thumb is: use it only if you’re aware of all possible errors your expression can throw AND you consider all of them irrelevant.

    A simple example is
    = @ $a [ «name» ];

    ?>
    There are only 2 possible problems here: a missing variable or a missing index. If you’re sure you’re fine with both cases, you’re good to go. And again: suppressing errors is not a crime. Not knowing when it’s safe to suppress them is definitely worse.

    After some time investigating as to why I was still getting errors that were supposed to be suppressed with @ I found the following.

    1. If you have set your own default error handler then the error still gets sent to the error handler regardless of the @ sign.

    codedokode / Зачем нужны исключения в PHP.md

    Этот урок переехал в мой гитхаб: https://github.com/codedokode/pasta/blob/master/php/exceptions.md — ниже представлена старая версия, потому советую перейти и прочитать новую.

    Как использовать исключения в PHP

    Если ты изучаешь ООП, ты наверняка натыкался на исключения. В мануале PHP описаны команды try / catch / throw и finally (доступна начиная с PHP 5.5), но не объясняется толком как их использовать. Чтобы разобраться с этим, надо узнать почему они вообще были придуманы.

    А придуманы они были, чтобы сделать удобную обработку ошибок.

    Для примера представим, что мы пишем приложение для вывода списка пользователей из файла на экран. Допустим, код выглядит как-то так:

    Все ли тут верно? Нет, не все. Мы забыли сделать обработку ошибок. Файла может не существовать, к нему может не быть доступа, данные в нем могут быть в неверном формате. Хорошая программа, разумеется должна обрабатывать такие ситуации и выводить соответствующее сообщение.

    Самый простой (но плохой) вариант — поместить код обработки и вывода ошибки прямо в loadUsersFromFile() :

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

    Что же, давай улучшим код и переделаем функцию, чтобы она возвращала массив из 2 элементов: если все ок, то элемент success содержит true , а элемент result содержит массив пользователей. Если же произошла ошибка, то в success будет находиться false , а в элементе error текст ошибки.

    Конечно, мы должны поменять и код, который вызывает функцию:

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

    В качестве решения проблемы были придуманы исключения. Если в функции произошла какая-то ошибка и она не может выполнить свою работу, то она выбрасывает исключение командой throw :

    Исключение — это объект встроенного в PHP класса Exception (мануал по Exception) или его наследника. Объект исключения содержит подробности о причинах ошибки. Также, в PHP есть еще другие классы исключений, которые ты можешь использовать: https://php.net/manual/ru/spl.exceptions.php

    В PHP7 определение расширено: исключения не обязаны наследоваться от Exception , это может быть любой класс, реализующий интерфейс Throwable, а так как сам Exception его реализует, то его наследники по-прежнему будут работать.

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

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

    Исключение по умолчанию (если оно не перехватывается) выходит из всех вызовов функций до самого верха и завершает программу, выводя сообщение об ошибке. Таким образом, если ты не перехватываешь исключения, то все равно увидишь причину ошибки (а если у тебя установлено расширение xdebug то еще и стектрейс — цепочку вызовов функций, внутри которых оно произошло). И тебе больше не надо писать if:

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

    Вот простой пример:

    В данном примере кода исключение мгновенно выйдет из всех вложенных вызовов функций и завершит программу. Это хорошо, так как если произошла какая-то неисправимая ошибка, выполнять программу дальше нельзя. Это называется принципом fail fast (статья на Хабре).

    Исключения можно «ловить». Это полезно в нескольких случаях. Иногда мы можем как-то отреагировать на неудачу: например, при ошибке скачивании файла по сети можно сделать паузу и повторить попытку. Для этого нам надо перехватить выброшенное функцией исключение.

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

    Перехватывать исключения в теории можно двумя способами: неструктурно и структурно. Неструктурно — это когда мы задаем обработчик исключений в начале программы:


    Этот способ ловит неперехваченные исключения любых видов во всей программе, его можно использовать для того, чтобы сделать свою страницу ошибки (об этом подробнее написано ниже). После срабатывания обработчика программа будет завершена, предотвратить это невозможно.

    Структурная обработка исключений — это когда мы ловим только исключения определенных типов в опредленном месте кода. Она реализуется с помощью try / catch :

    В PHP5.5 и выше добавлен блок finally . Команды из этого блока будут выполнены после любого из блоков ( try или catch ) — в случае если исключения не произойдет и в случае если оно произойдет.

    Перехватывать абсолютно любые типы исключений — плохая идея, так как мы обычно хотим обрабатывать только определенные, «наши», типы ошибок и не знаем что делать с другими. Чтобы перехватывать только нужные нам исключения, надо сделать свой класс на основе встроенного в PHP Exception :

    Выкидывать его в throw

    И ловить в catch только наши исключения:

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

    Поддержка исключений везде

    Эта система работала бы идеально, если бы стандартные функции PHP выкидывали исключения при ошибках. Но увы, по историческим причинам эти функции просто генерируют сообщение об ошибке и возвращают false . Ну например, функция чтения файла в память file_get_contents поступает именно так, и ошибка чтения файла или его отсуствие не завершает программу. Потому ты обязан ставить if после каждого вызова:

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

    Для этой проблемы есть решение. Можно установить общий обработчик ошибок (он вызывается при любой ошибке PHP, например обращении к несуществующей переменной или невозможности чтения файла), и в нем выкидывать исключение. Таким образом, любая ошибка или предупреждение приведут к выбросу исключения. Все это делается в несколько строчек с помощью встроенного в PHP класса ErrorException (мануал):

    Этот код превращает любые ошибки и предупреждения PHP в исключения. Некоторые современные фреймворки (Slim) включают в себя такой код.

    Исключения и PDO

    Чтобы расширение для работы с базами данных PDO использовало исключения (например при попытке выполнить неправильно написанный SQL запрос), надо установить соответствующий параметр (рекомендуется). Без него ты будешь должен после вызова каждой функции проверять результат с помощью if :

    Исключения и mysqli

    Библиотека mysqli при ошибках не выбрасывает исключений и не генерирует предупреждений, а просто возвращает false (то есть молчит как партизан). Таким образом, после каждого действия ты должен проверять результат с помощью if , что видно в примерах кода в мануале: https://php.net/manual/ru/mysqli.query.php

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

    Чтобы не писать ифы во всей программе, ты можешь сделать класс-обертку над mysqli. Или просто использовать PDO.

    Так делать не надо

    Не стоит ловить все исключения без разбора:

    Лучше создать свой класс исключений и ловить только его.

    Не надо скрывать информацию об ошибках. В 99% этот код, игнорирующий исключение, неправильный:

    Не надо располагать try / catch и throw на одном уровне — в этом случае проще написать if :

    Страница ошибки в веб-приложениях

    По умолчанию при непойманном исключении PHP завершает скрипт. Если опция display_errors в php.ini равна 1, то PHP выводит подробности об исключении, а если она равна 0, то в браузере отображается просто белая страница. Также, PHP записывает информацию об исключении в лог ошибок сервера.

    Очевидно что оба варианта не годятся для использования на продакшен («боевом») сервере: обычные пользователи не должны видеть непонятные надписи на английском о твоем приложении, и тем более не должны смотреть на пустую страницу и гадать в чем дело. А хакеры не должны видеть подробности об устройстве твоего приложения. Более того, PHP не выдает при ошибке HTTP код 500, который говорит роботам (вроде Гугла или Яндекса) что на странице ошибка и индексировать ее на надо. Разработчики PHP конечно выбрали неудачный способ поведения по умолчанию.

    Потому на боевом сервере надо ставить display_errors в 0, а в приложении делать свою страницу ошибки.

    Что будет, если просто не ловить исключение:

    • информация пишется в лог (ок)
    • на компьютере разработчика выводятся подробности (ок)
    • пользователь видит белую страницу или подробности ошибки (плохо)
    • отдается HTTP код 200 (плохо)

    Как надо обрабатывать исключения:

    • записать информацию в лог
    • показать пользователю заглушку («сайт временно недоступен, вот контакты администратора»)
    • на заглушке выставить HTTP код ответа 503 для роботов
    • на компьютере разработчика (при display_errors = 1) можно показать подробности и стектрейс

    Для реализации страницы ошибки можно либо сделать try/catch на уровне FrontController, либо установить свой обработчик исключений через set_exception_handler . Не забудь записать информацию в лог с помощью error_log($e->__toString()) — иначе ты не узнаешь об ошибках которые происходят у пользователей твоего приложения.

    Если ты используешь фреймворк, возможно, в нем все это уже реализовано. Современные фрейморки, такие как Slim, Yii 2, Symfony 2, выводят заглушку при непойманном исключении. Старые — не выводят.

    Мастер Йода рекомендует:  ТОП-10 фреймворков для веб-разработки в 2020

    Механизм исключений существует и в других языках в таком же виде: Java, C++, Ruby, Javascript и многих других. Статья в вики:

    Также, про исключения можно почитать в книгах:

    • Мэтт Зандстра «PHP: Объекты, шаблоны, методики программирования»
    • Джордж Шлосснейгл «Профессиональное программирование на PHP»

    PROG-TIME

    Скрипт для вывода ошибок на PHP. Вывод всех типов ошибок.

    Всем привет. Сегодня мы с вами рассмотрим как вывести любые ошибки в php коде, и я вам покажу специальный скрипт для вывода всех типов ошибок. Дело в том что стандартная проверка ошибок, которая стоит на хостинге, не всегда выводит все ошибки и из-за этого появляются трудности в нахождение недочетов в коде.

    В начале я покажу код который выводит все ошибки, чтобы не задерживать тех кто пришел только за этим. Те же из вас кто учится и первый раз с этим сталкивается, советую вам изучить виды ошибок, это вы найдете ниже.

    Скрипт для вывода ошибок

    Вот так выглядит скрипт:

    ini_set — Устанавливает значение настройки конфигурации. Настройка будет хранить установленное значение пока выполняется скрипт. После завершения работы скрипта значение настройки вернется к исходному.

    error_reporting — Задает, какие ошибки PHP попадут в отчет. Здесь в качестве параметра вы можете задать нужный тип ошибок из списка доступных. У меня стоит E_ALL , что означает вывод всех типов ошибок.

    Если display_errors = on , то в случае ошибки браузер получит html c текстом ошибки и кодом 200.

    Если же display_errors = off , то для фатальных ошибок код ответа будет 500 и результат не будет возвращён пользователю, для остальных ошибок – код будет работать неправильно, но никому об этом не расскажет.

    Это не обязательно, но все же, хочу сказать как лучше всего реализовать работу данного скрипта. Я это делаю следующим образом: добавляю скрипт в главный файл сайта (чаще всего это index.php). Можно прописать туда код или подключить как сторонний файл. И после этого я прописываю в файл .htaccess код, который производит редирект каждого запроса к сайту через файл index.php. Из этого получается что index.php становится файлом конфигурации и в него по мимо этого можно добавить другие скрипты, которые будет срабатывать при каждой загрузке сайта.

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

    Теперь давайте поговорим о типах ошибок.

    Типы ошибок в PHP

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

    Вам достаточно просто записать название и что оно обозначает.

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

    Фатальные ошибки

    Начнем мы с первой группы. Эти ошибки останавливают работу кода или совсем не дают ему запуститься.

    E_PARSE

    Самая популярная ошибка у начинающих разработчиков. Эта ошибка появляется, когда вы допускаете грубую нарушение синтаксиса и интерпретатор PHP не понимает, что вы от него хотите.

    Вот в чем может быть ошибка:

    • Не закрыта или имеется лишняя скобка
    • В конце строки не стоит точка с запятой
    • Специальные знаки стоят в неположенном месте

    E_ERROR

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

    Вот в чем может быть ошибка:

    • не найден файл, неправильно указан путь к файлу.
    • попытка вызвать несуществующий метод класса
    • Отсутствия свободной памяти (больше, чем прописано в директиве memory_limit ) или ещё чего-нить подобного
    • Рекурсивный вызов функции. В данном примере он закончился на 256-ой итерации, ибо так прописано в настройках xdebug

    Это все что касается фатальных ошибок. Теперь поговорим о не фатальных ошибка. Это самые противные ошибки, так как с ними больше всего хлопот из-за трудности их поимки и исправление.

    Не фатальные ошибки

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

    E_WARNING

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

    E_NOTICE

    Это самые распространенные ошибки, мало того, есть любители отключать вывод ошибок и клепают их целыми днями. Возникают при целом ряде тривиальных ошибок.

    Сюда входят следующие ошибки:

    • Обращение в неопределенной переменной
    • Обращение к несуществующему элименту
    • Обращение к несуществующей константе
    • Конвертация типов данных.

    E_STRICT

    Это ошибки, которые научат вас писать код правильно, чтобы не было стыдно, тем более IDE вам эти ошибки сразу показывают. Вот например, если вызвали не статический метод как статику, то код будет работать, но это как-то неправильно, и возможно появление серьёзных ошибок, если в дальнейшем метод класса будет изменён, и появится обращение к $this .

    E_DEPRECATED

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

    Ошибки в коде нагружают вашу программу и начинает медленно работать. При этом некоторые ошибки могут даже испортить вашу программу, так что вы со стороны не заметите.

    При работе с серьезными проектам, обязательно тщательно проверять на ошибки работу программ.

    В дальнейшем, возможно, я выпущу более подробную запись об ошибках. В данной же записи я хотел ваш показать скрипт вывода всех ошибок.

    hipot

    hipot srew

    Последний раз редактировалось:
    25.11.2010 13:00 (вер.1.06)

    Стандарт написания кода — это очень важно

    Опыт многих проектов показывает, что при использовании стандартов кодирования управление и разработка идет легко и гладко. Но достаточно ли стандарта для успешного проекта? Конечно, нет, но они помогают. А мы должны использовать все инструменты, которые упрощают нам жизнь! Поверьте, многие протесты против стандарта кодирования исходят из чьего-то ущемленного самолюбия. Но для того, чтобы следовать стандартам необходимо минимальное усилие над собой, а также необходимо помнить, что любой проект — это коллективная работа.

    Хороший стандарт кодирования важен в любом проекте, и особенно там, где множество разработчиков работают над одним проектом. Наличие стандарта кодирования помогает гарантировать, что код высокого качества, с меньшим количеством ошибок, и легко поддерживается. Правила форматирования кода должны быть едиными во всем проекте. И крайне желательно, чтобы они были очень похожими между проектами.

    Содержание

    Отступы

    Использовать tab вместо пробелов, т.к. обычно редактор настраивается, сколько пробелов проставлять за tab. Делаем отступов столько, сколько необходимо, но не больше. Существует правило о максимуме числа отступов. Если вложенность в коде больше, чем 4 или 5 уровней, то следует задуматься о переработке такого кода. Конечно, это рекомендация, в реальной жизни уменьшить число вложений до 5ти не всегда возможно, поэтому будем надеяться на мудрость программиста при написании кода.

    #2. Соглашения по именованию

    Хорошее именование в коде имеет определяющее значение при отладке, поиске ошибок и дальнейшей работе с кодом.


    Имена файлов

    1. Для файлов допустимы буквенно-числовые символы (нижнего регистра), символы нижнего подчеркивания и тире («-»). Пробелы запрещены. Необходимость верхнего регистра обсуждается в частных случаях.
    2. Если файл содержит любой php-код, то он должен заканчиваться «.php»

    Классы

    1. Желательно использовать namespace-нотацию
    2. Имена классов могут содержать только буквенно-числовые символы. Числа допустимы в именах классов, но не приветствуются. Символы нижнего подчеркивания допустимы в местах разделителей пути — напр. желательно, чтобы имя файла « ClassLib/Db/Table.php » указывало на класс с именем « ClassLib_Db_Table » (namespace-нотация).
    3. Если имя класса состоит из более, чем одного слова, то первая буква каждого слова должна быть заглавной. Последующие заглавные буквы недопустимы, например, имя класса « WorkPDF » — недопустимо, в то время как имя « WorkPdf » допустимо.
    4. Разъяснение 3): столкнувшись с ситуацией, когда необходимо использовать все верхние буквы аббревиатуры в названии, пишем первую прописную, а остальные строчные. Обоснование: Возьмем, к примеру, NetworkABCKey . Обратите внимание, как легко можно неверно понять аббревиатуру ABCK , и не заметить сразу, что далее идет Key . В данном случае, верно назвать NetworkAbcKey . Например: Используем HtmlStatistic вместо HTMLStatistic .

    Интерфейсы (пока бог нас от них уберег, однако:)

    1. Интерфейсы должны следовать той же схеме именования, как и классы (смотрите выше), однако их имя должно заканчиваться словом « Interface », как в следующих примерах: WorkPdf_Interface , ControllerDispatcher_Interface

    Именование функций и методов

    1. Имена функций могут содержать буквенно-числовые символы. Символы нижнего подчеркивания не разрешены. Числа разрешены в именах функций, но не приветствуются.
    2. Имена функций должны всегда начинаться с буквы в верхнем регистре. Когда имя функции состоит из более, чем одного слова, первая буква каждого нового слова должна быть заглавной. Это обычно называется «верблюжьей» («СamelCase») нотацией. Обычно, метод или функция выполняют какое-либо действие, поэтому имя такого метода или функции должно указывать на это действие: CheckForErrors() вместо ErrorCheck() , DumpDataToFile() вместо DataFile() .
    3. Многословность приветствуется. Имена функций должны быть настолько говорящими, насколько это практично для повышения понимаемости кода.
    4. Если необходимо в функции что-то выяснить, то удачно дать ей имя с префиксом Is . Напр. IsAuthorized()
    5. Для объектно-ориентированного программирования принято, чтобы методы доступа имели префикс « Get » или « Set » (если необходимо что-либо вернуть, либо установить)
    6. Функции в глобальной области видимости («плавающие функции») допустимы, но не приветствуются. Рекомендуется обрамлять такие функции в статические классы. Написание статических методов формирует библиотеку классов, которую можно будет повторно использовать.
    7. Если функция является рекурсивной, то у нее должен быть суффикс « _r » (напр. WalkBsp_r() )

    Именование методов в классах

    1. Имена методов, в отличие от функций, могут начинаться с буквы в нижнем регистре. Когда имя метода состоит из более, чем одного слова, первая буква каждого нового слова должна быть заглавной. Это обычно называется «верблюжьей» нотацией.
    2. Для методов, объявленных как private или protected первый символ должен быть нижним подчеркиванием.

    Именование переменных

    1. Имена переменных могут содержать буквенно-числовые символы. Символы нижнего подчеркивания не разрешены (см. п.5). Числа разрешены в именах переменных, но не приветствуются
    2. Как и имена функций (смотрите выше) имена переменных должны начинаться с буквы в нижнем регистре и следовать «верблюжьей» нотации.
    3. Для переменных — членов классов, определенных с помощью префиксов области видимости « private » или « protected », первый символ имени должен быть один символ нижнего подчеркивания. Это единственное допустимое использование символа нижнего подчеркивания в имени. Переменные — члены классов определенные с помощью префикса области видимости « public » никогда не должны начинаться с символа нижнего подчеркивания.
    4. Многословность приветствуется. Имена переменных должны быть настолько говорящими, насколько это практично. Краткие имена переменных, такие как « $i » и « $n » не приветствуются нигде, кроме как в контексте маленьких циклов. Если цикл содержит более 20 строк кода, то переменные для индексов должны иметь более говорящие имена.
    5. Имена переменных, содержащие только нижний регистр и знак подчеркивания, разрешается использовать только в локальных частях кода, содержащего не более 20 строк. В противном случае переменной необходимо давать осмысленное название.
    6. Встроенные переменные PHP true , false и null должны быть написаны в нижнем регистре.
    7. Использование говорящих префиксов/суффиксов — это хорошо: Например, Max — обозначает, что переменная хранит какой-либо максимум, Cnt, Count — обозначает, что переменная хранит кол-во чего-либо. Например: $itemsMax — максимальное значение в массиве; $dateOfSomething — дата какого-либо события; $useHtml, $isHtml — для флагов.

    Префиксы имен переменных для удобочитаемости

    Использование префиксов является строго рекомендуемым, однако в частных случаях разрешено отступать от них. PHP — не особо типизированый язык и в нем различаются по смыслу три группы типов: скалярные, массивы и объекты. Скалярные типы следует начинать с префиксов всегда, если точно известно, что они имеют заданный тип:

    1. ’ ar ’ — Массивы
    2. ’ ob ’, ’ o ’ — Объекты
    3. ’ b ’ — тип boolen
    4. ’ g ’ — глобальные переменные
    5. ’ db ’ — дескриптор результата БД (напр. при возврате в bitrix объекта CDBResult )
    6. ’ res ’, ’ rs ’ — ресурс (напр. дескриптор открытого файла)
    7. ’ r ’ — для параметров функции, используемых как ссылка (см. пример). Тогда при написании кода в функции мы наглядно знаем, меняет ли функция переданную переменную.

    Константы

    1. Константы могут содержать буквенно-числовые символы и символы нижнего подчеркивания. Числа разрешены в именах констант.
    2. Имена констант должны быть в верхнем регистре.
    3. Имена констант из нескольких слов пишутся, разделяя каждое слово знаком подчеркивания (напр. EMBED_SURPRESS )
    4. Константы должны быть определены как члены классов с использованием ключевого слова « const ». Определение констант в глобальной области видимости с помощью « define » допустимо, но не рекомендуется:

    #3. Стиль кодирования

    Строковые литералы

    1. Когда строка является литеральной (не содержит подстановок переменных), для ее обрамления должны использоваться апострофы или «одинарные кавычки» ( $a = ‘Example String’; )
    2. Когда строка литералов сама содержит апострофы, разрешается для обрамления строки использовать «двойные кавычки». Это особенно актуально для SQL-запросов:

    Конкатенация строк

    1. Строки должны объединятся с помощью оператора « . ». Пробел должен всегда добавляться до и после оператора « . » для улучшения читабельности: ( $company = ‘Zend’ . ‘Technologies’; )
    2. Когда производится конкатенация строк с помощью оператора « . », разрешается разрывать выражение на несколько строк для улучшения читабельности. В этом случае, каждая следующая строка должна быть дополнена пробелами так, чтобы оператор « . » был выровнен под оператором « = »:

    Массивы с числовыми индексами

    1. Хотя индекс массива может начинаться с отрицательного числа, но это не приветствуется и рекомендуется, чтобы все массивы начинали индексирование с 0 .
    2. Когда определяется индексированный массив с помощью конструкции array , завершающий пробел должен быть добавлен после каждой запятой для улучшения читабельности:
    3. Также разрешается определять многострочные индексированные массивы, используя конструкцию « array ». В этом случае, каждая следующая строка должна быть дополнена пробелами так, чтобы начало каждой строки было выравнено как показано ниже:

    Ассоциативные массивы

    1. Когда определяется ассоциативный массив с помощью конструкции « array », приветствуется разделение выражения на несколько строк. В этом случае, каждая следующая строка должна быть дополнена с помощью пробелов так, чтобы и ключи и значения были выровнены:

    Определение класса

    Классы должны определяться по следующей схеме:

    1. Фигурная скобка всегда пишется на следующей строке под именем класса.
    2. Каждый класс должен иметь блок документации (doc-блок) в соответствии со стандартом PHPDocumentor.
    3. Код внутри класса должен иметь отступ.
    4. Только один класс разрешен внутри одного PHP-файла. Размещение дополнительно кода в файле с классом разрешено, но не приветствуется. В таких файлах, две пустые строки должны разделять класс и дополнительный PHP-код.

    Пример:

    Переменные-члены классов

    Переменные-члены классов должны определяться по следующей схеме:

    1. Имена переменных-членов класса могут именоваться, как обычные переменные (см. именование переменных выше)
    2. Любые переменные, определенные в классе, должны быть определены в начале класса, до определения любого метода.
    3. Ключевое слово var не рекомендуется. Желательно всегда определять область видимости членов, используя ключевое слово private , protected или public .
    4. Доступ к переменным-членам класса напрямую используя префикс public разрешено, но не приветствуется в пользу методов доступа ( set/get )

    Определение функций и методов

    Функции должны определяться по следующей схеме:

    1. Функции должны именоваться согласно правилам именования (см. раздел именование функций и методов)
    2. Функции внутри классов должны всегда определять свою область видимости с помощью одного из префиксов private , protected или public .
    3. Как и у классов, фигурная скобка всегда пишется на следующей строке под именем функции. Пробелы между именем функции и круглой скобкой для аргументов отсутствуют. («one true brace» форма)
    4. Функции в глобальной области видимости крайне не приветствуются.
    5. Аргументы функций со значениями по умолчанию должны находиться в конце списка аргументов.
    6. Передача по ссылке во время вызова запрещена. Передача по ссылке допустима только в определениях функций:
    7. Возвращаемое значение не должно обрамляться в круглые скобки, иначе это ухудшает читабельность, а также может поломать код, если метод позже станет возвращать результат по ссылке.

    Использование функций и методов

    Функции должны определяться по следующей схеме:

    1. Аргументы функции разделяются одним завершающим пробелом после каждой запятой.
    2. Вызовы функций должны быть написаны без отступов между именем функции, открывающей скобкой и первым параметром. Отступы в виде пробела должны присутствовать после каждой запятой в перечислении параметров ( $var = foo($bar, $baz, $quux); )
    3. Передача по ссылке во время вызова запрещена. Смотрите секцию определения функций для правильного способа передачи аргументов функции по ссылке.
    4. Для функций, чьи аргументы допускают массив, вызов функции может включать конструкцию « array » и может быть разделено на несколько строк для улучшения читабельности. В этом случае, применим стандарт описания массивов:

    Управляющие структуры и простановка скобок

    Управляющие структуры включают в себя операторы if , for , while , switch , и др. Ниже приведен пример оформления оператора if , который в этом отношении является самым сложным. Его и рассмотрим, другие пишутся по аналогии. Этот стиль называется «trailing braces», его использовать во всех управляющих конструкциях. Стиль «one true brace» (каждая скобка на новой строке) остается в черном списке, пользоваться им вне декларации классов и функций ПОКА можно, но строго не рекомендуется (см. правила определения функций и методов и правило определения классов).

    1. Управляющие структуры, основанные на конструкциях if и elseif , должны иметь один пробел до открывающей круглой скобки условия, и один пробел после закрывающей круглой скобки.
    2. Внутри выражения условия между круглыми скобками операторы должны разделяться пробелами для читабельности. Внутренние скобки приветствуются для улучшения логической группировки больших условий.
    3. Открывающаяся фигурная скобка пишется на той же строке, что и условие. Закрывающаяся фигурная скобка пишется на отдельной строке. Все содержимое между скобками пишется с отступом в четыре пробела (или один tab).
    4. Для выражения if , включая elseif или else , форматирование должно быть таким, как в следующем примере:
    5. Ключевые слова должны быть строго в нижнем регистре: array, if, foreach, while, true, false, null, new, class, function, .

    PHP допускает написание таких выражений без фигурных скобок при некоторых условиях. Стандарт кодирования не делает различий — для всех if , elseif или else выражений необходимо использовать фигурные скобки. Настойчиво рекомендуется использовать фигурные скобки, даже в том случае, когда их использование не является необходимостью. Использование фигурных скобок увеличивает читабельность кода и уменьшает вероятность логических ошибок при изменении кода.

    Использование комбинации « else if » вместо конструкции elseif допускается.


    Альтернативный синтаксис рекомендуется использовать только в частях, которые используют прерывания на вывод html-кусков (напр. для шаблонов вывода). Просто в отформатированном PHP-коде строго не рекомендуется использовать альтернативный синтаксис, т.к. теряется учет открытых-закрытых скобок (к тому же многие среды разработки позволяют легко найти открывающуюся скобку по закрытой, но не позволяют найти начало if (…): по его окончанию — endif; ). Пример:

    Правила написания switch-конструкции

    1. Управляющие структуры написанные с использованием « switch » конструкции должны иметь один пробел до открывающей круглой скобки условного выражения, и также один пробел после закрывающей круглой скобки.
    2. Все содержимое между фигурными скобками пишется с отступом. Содержимое каждого « case » выражения также должно писаться с отступом
    3. Ключевое слово default никогда не должно опускаться в выражении switch .
    4. ЗАМЕЧАНИЕ: Иногда полезно писать case-выражения, которые передают управление следующему case-выражению, опуская break или return . Для того, чтобы отличать такие случаи от ошибок, каждое case-выражение, где опущен break или return , должно содержать комментарий (напр. « // break intentionally omitted »).

    Тернарный оператор ’?:’

    Проблема обычно заключается в том, что люди пытаются запихать слишком много кода между «?» и » :» . Вот несколько правил:

    1. Условие заключайте в скобки, тем самым отделяя его от остального кода
    2. По возможности действия, производимые по условию, должны быть простыми функциями
    3. Если весь блок ветвления плохо читается, будучи расположен на одной строке, то блоки else размещайте каждый на отдельной строке
    Мастер Йода рекомендует:  Манифест Хакера

    Использование коротких тегов ’ short_open_tag конфигурационного файла php.ini. Для вывода в шаблоне одной переменной или результата выражения удобно пользоваться записью ’ ’ вместо ’ ’. Для длинных выражений (более одного тернарного оператора) использование такой записи практически не оправдано. Пример:

    Пробелы вокруг знаков операций

    Любые операторы / знаки операций (например =, ==, =>, >, и т.п.) обязательно отделяются пробелами с обоих сторон. В арифметических выражениях количество пробелов вокруг знаков операций можно варьировать, чтобы подчеркнуть приоритет операций. Примеры:

    Пробелы вокруг сложных индексных выражений

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

    Декларативный блок желательно выравнивать по правому краю

    Данный подход упрощает читаемость и понятность кода. Используем пробелы после знака присвоения для этих целей.

    Каждый оператор должен быть на новой строке

    Необходимо, чтобы в каждой строчке присутствовало только одно выражение.

    Напр. допустимо: Не допустимо:

    Всегда документировать пустое выражение

    Пустые строки для дробления кода на логические блоки

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

    Перед логической секцией рекомендуется вставить комментарий, в котором будет указано назначение этой секции. Удобно в этом случае пользоваться тегом @todo из стандарта PHPDocumentor’a: (см. раздел «Встроенная документация»)

    Подключение файлов: include или require?

    В тех местах, где вы используете подключение файлов других классов вне зависимости от условий, используйте конструкцию require_once() . Если же подключение файлов зависит от каких-либо условий, то следует использовать include_once() . В этом случае вы всегда будете уверены в том, что файлы подключаются только единожды. include_once() и require_once() и являются конструкциями, а не функциями. Вам не обязательно использовать скобки вокруг имени файла, который подключается. Использование include() и require() не рекомендуется.

    Встроенная документация и комментарии

    Комментарии внутри кода классов должны соответствовать синтаксису комментариев PHPDoc, который напоминает Javadoc. За дополнительной информацией о PHPDoc обращайтесь сюда: https://www.phpdoc.org/

    К примеру, редактор Zend 5.51/8.0 очень хорошо работает с подобной документацией, следует впереди определения функции или класса набрать ’ /** ’ и нажать Enter .

    Дополнительные комментарии, кроме тех, что предусмотрены PHPDoc, только приветствуются. Основное правило в данном случае — каждая часть кода повышенной сложности должна быть прокомментирована до того, как вы забыли, как она работает.

    Подходят комментарии в стилях C ( /**/ ) и C++ ( // ). Использование комментариев в стиле Perl/shell ( # ) не рекомендуется.

    1. Все блоки документации («docblocks») должны быть совместимы с форматом phpDocumentor. Описание формата phpDocumentor вне рамок данного докумета. Для дополнительно информации смотрите: https://www.phpdoc.org/
    2. Всем файлам с исходными кодами, рекомендуется содержать «файловые» doc-блоки в начале каждого файла и обязательно наличие «классового» doc-блок непосредственно перед каждым классом. Ниже даны примеры таких doc-блоков.

    Встроенная документация — Файлы

    В каждый файл, содержащий PHP-код, желательно размещать заголовочный блок в начале файла, содержащий как минимум следующие phpDocumentor-теги:

    Встроенная документация — Классы

    Аналогично файлам, однако для класса обязательно: каждый класс должен иметь doc-блок, содержащий как минимум следующие phpDocumentor-теги: @copyright , @version , @link

    Встроенная документация — Функции

    Для функций и методов документация в виде phpDocumentator обязательна. Каждая функция, включая методы объектов, должна иметь doc-блок, содержащий как минимум:

    1. Описание функции
    2. Все аргументы
    3. Все возможные возвращаемые значения
    4. Нет надобности использовать тег « @access », потому что область видимости уже известна из ключевых слов « public », « private » или « protected ». используемых при определении функции.
    5. Если функция/метод может выбрасывать исключение, используйте тег @throw

    #4. Дополнительные частные случаи, на которые следует обратить внимание

    Не следует делать реальную работу в конструкторе

    Напр. если мы хотим открыть соединение c БД, то делаем метод Open(), в котором и совершаем открытие. Причина: конструктор не может вернуть значение (напр. ошибку).

    Короткие методы

    Желательно, чтобы метод (функция) занимал не более одной страницы кода. Большой метод необходимо делить на кучу маленьких, в таком случае мы добиваемся преждевременной оптимизации кода за счет продумывания структуры одной большой задачи и разделение их на подзадачи (структурный подход к построению решения)

    Рефакторинг

    Не живите с «разбитыми окнами»!

    Не оставляйте «разбитые окна» (неудачные конструкции, неверные решения или некачественный текст программы) без внимания. Как только Вы их обнаружите — чините сразу. Часто безошибочные, функциональные системы быстро портились, как только окна начали разбиваться. Не давайте энтропии победить себя.

    Старайтесь повторно использовать свой и чужой труд

    Очень часто разработчики ленятся делать библиотеки классов & методов, которые упрощают жизнь и себе и команде. Очень хорошо, когда программист собирает себе библиотеку с кодом для последующего использования. Конечно, это идеальная картина, когда в студии существует хорошо задокументированная библиотека наработок и о том, что в ней находится, знают все разработчики студии.

    Do not Repeat Youself — не повторяй самого себя!

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

    Don’t Reinvent Wheel — Не переизобретайте колесо!

    Не переизобретайте колесо — если подобное колесо уже существует, просто адаптируйте его для своих нужд. Вероятно, для решения данной проблемы уже существует стандартный модуль в ядре PHP или API CMS, или модуль, разработанный другими людьми внутри организации. Иногда не составляет труда найти нужный код в интернете.

    Куски кода и ответственность

    Каждый человек должен отвечать за свои куски кода. Соответственно, если в них возникают ошибки, то человек, который написал код, идет исправлять ошибку. Тем более если из-за части чьего-то кода перестает работать вся целая система, то за эту часть «создатель» должен нести ответственность.

    Как мне получить ошибки PHP?

    Я проверил мой файл инициализации PHP ( php.ini ) и установил display_errors , а также отчет об ошибках E_ALL . Я перезапустил свой веб-сервер Apache.

    Я даже поместил эти строки в начало моего скрипта, и он даже не ловит простые ошибки разбора. Например, я объявляю переменные с «$» и не закрываю операторы «;» . Но все мои сценарии показывают пустую страницу с этими ошибками, но я хочу видеть ошибки в выводе моего браузера.

    Что осталось сделать?

    Это всегда работает для меня:

    Однако это не заставляет PHP отображать ошибки синтаксического анализа — единственный способ показать эти ошибки — изменить ваш php.ini с помощью следующей строки:

    (если у вас нет доступа к php.ini , то помещение этой строки в .htaccess также может работать):

    Вы не можете улавливать ошибки синтаксического анализа при включении вывода ошибок во время выполнения, поскольку он анализирует файл до фактического выполнения чего-либо (и поскольку во время этого он сталкивается с ошибкой, он ничего не выполнит). Вам нужно будет изменить фактическую конфигурацию сервера, чтобы display_errors был включен, и использовался соответствующий уровень error_reporting. Если у вас нет доступа к php.ini, вы можете использовать .htaccess или подобное, в зависимости от сервера.

    Этот вопрос может предоставить дополнительную информацию.

    Внутри php.ini:

    Затем перезапустите веб-сервер.

    Чтобы отобразить все ошибки, вам необходимо:

    1. Возьмите эти строки в скрипте PHP, который вы вызываете из браузера (обычно index.php ):

    2. (a) Убедитесь, что этот скрипт не имеет синтаксических ошибок

    2. (b) Установите display_errors = On в свой php.ini

    В противном случае он не может даже запустить эти 2 строки!

    Вы можете проверить наличие синтаксических ошибок в вашем скрипте, выполнив (в командной строке):

    Если вы включите скрипт из другого скрипта PHP, он отобразит синтаксические ошибки во включенном скрипте. Например:

    index.php

    my_script.php

    Некоторые провайдеры веб-хостинга позволяют изменять параметры PHP в файле .htaccess .

    Вы можете добавить следующую строку:

    У меня была та же проблема, что и у вас, и это решение исправило ее.

    Вы можете обнаружить, что все настройки для «сообщений об ошибках» или «ошибок отображения», похоже, не работают в PHP 7. Это связано с тем, что обработка ошибок изменилась. Вместо этого попробуйте:

    Или, чтобы перехватывать исключения и ошибки за один раз (это не обратно совместимо с PHP 5):

    Это будет работать:

    Это лучший способ записать его, но синтаксическая ошибка дает пустой вывод, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отладки PHP-кода — использовать консоль; выполните следующие действия:

    Установите это в вашем файле index.php:

    Создайте файл с именем php.ini в папке, где находится ваш PHP файл.

    Внутри php.ini добавьте следующий код (я даю простую ошибку, показывающую код):

    Вот сценарий PHP:

    Для более подробного объяснения ошибок PHP посетите PHP Error — error_reporting().

    Если, несмотря на все приведенные выше ответы (или вы не можете отредактировать файл php.ini), вы все равно не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который будет включать отчет об ошибках, а затем включить файл проблемы. например:

    Несмотря на то, что все правильно установлено в моем файле php.ini , это был единственный способ поймать ошибку пространства имен. Мой точный сценарий:

    При использовании PHP в качестве модуля Apache мы можем изменить параметры конфигурации с помощью директив в файлах конфигурации Apache (например, httpd.conf) и .htaccess. Для этого вам понадобятся «AllowOverride Options» или «AllowOverride All».

    Обычно я использую следующий код в моих простых проектах PHP.

    Поскольку мы сейчас работаем с PHP 7, приведенные здесь ответы больше не верны. Единственный, который все еще в порядке, — это тот, что говорит Фрэнк Форте, когда он говорит о PHP 7

    С другой стороны, вместо того, чтобы пытаться ловить ошибки с помощью try/catch, вы можете использовать хитрость: используйте include.

    Вот три куска кода:

    Запуск этого в PHP 7 ничего не покажет.

    Теперь попробуйте это:

    Теперь запустите tst2, который устанавливает отчеты об ошибках, а затем включите tst3. Ты увидишь:

    Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла, ожидаемая переменная (T_VARIABLE) или $ <(T_DOLLAR_OPEN_CURLY_BRACES) или <$ (T_CURLY_OPEN) в tst3.php в строке 4

    Если вы каким-то образом окажетесь в ситуации, когда вы не можете модифицировать настройку с помощью php.ini или .htaccess , вам не повезло для отображения ошибок, когда ваши скрипты PHP содержат ошибки синтаксического анализа. Затем вам нужно будет разрешить лить файлы в командной строке следующим образом:

    Если ваш хост заблокирован, что он не позволяет изменять значение через php.ini или .htaccess , он также может запретить изменение значения через ini_set . Вы можете проверить это со следующим PHP скрипт:

    Вы можете сделать что-то вроде ниже:

    Установите следующие параметры в вашем главном индексном файле:

    Затем на основе ваших требований вы можете выбрать, что вы хотите показать:

    Для всех ошибок, предупреждений и уведомлений:

    Для всех ошибок:

    Для всех предупреждений:

    Для всех уведомлений:

    Для получения дополнительной информации, проверьте здесь.

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

    E_DEPRECATED); register_shutdown_function(«shutdownFunction»); set_exception_handler(«EXC_HANDLER»);

    Лучшее/простое/быстрое решение, которое вы можете использовать, если это быстрая отладка, — это окружить ваш код перехватом исключений. Это то, что я делаю, когда хочу проверить что-то быстрое в производстве.

    Этот код сверху должен работать:

    Однако попробуйте отредактировать код на телефоне в файле:

    Вот чему я научился. В файле PHP.INI

    Пока ваш сайт работает, в файле php.ini по соображениям безопасности должен быть отключен display_errors. Однако для среды разработки display_errors можно включить для устранения неполадок.

    Вы можете сделать это, изменив файл php.ini и добавив следующее

    ИЛИ вы также можете использовать следующий код, так как это всегда работает для меня

    Если у вас установлен Xdebug, вы можете переопределить все настройки, установив:

    Тип: int, Значение по умолчанию: 0, Введено в Xdebug> = 2.3. Если для этого параметра установлено значение 1, ошибки будут отображаться всегда, независимо от значения PHP display_errors.

    Пишем PHP код, устойчивый к ошибкам PHP

    Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

    Пишем PHP код, устойчивый к ошибкам
    Александр Неткачев
    alex@devlink.crimea.ua
    devlink.crimea.ua
    Предисловие

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

    В этой статье я постараюсь собрать техники и приемы, позволяющие минимизировать количество ошибок в программе, написанной на PHP. Но некоторые из представленных методов могут пригодится если вы пишите на любом языке программирования.
    Знание — половина успеха
    Узнаем, о чем сообщает PHP

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

    В PHP контроль вывода сообщений транслятора определяется функцией error_reporting и значением директивы error_reporting в php.ini. Рекомендуемое её значение E_ALL — т.е. выводить сообщения о всех потенциально опасных ситуациях. К ним в PHP относятся, например, использование неинициализированной переменной, обращение к несуществующему элементу массива и т.д.

    Для включения максимально подробного вывода сообщений транслятора поставьте в начале программы вызов функции error_reporting:
    // Для PHP4
    error_reporting(E_ALL);

    или поставьте значение error_reporting = E_ALL в php.ini.

    С более подробном описании возможных уровней reporting можно знакомится в PHP документации — Error Handling and Logging Functions.

    Для PHP5 введен уровень E_STRICT, который включает вывод сообщений о использовании в коде устаревших методов программирования (например, используется var для описания внутренних переменных класса). Он не входит в E_ALL, поэтому для PHP5 рекомендуемый уровень сообщений E_ALL | E_STRICT (т.е. E_ALL и E_STRICT). Соответственно, для задания вывода всех сообщений от транслятора надо вызвать error_reporting с таким параметром:
    // Для PHP5
    error_reporting(E_ALL | E_STRICT);
    Если ни о чем не сообщает

    Если Вы установили вывод ошибок и ошибки по не выводятся, то возможно вывод ошибок в script output отключен. Проверьте значение опции ini файла display_errors (она включает вывод ошибок непосрественно в script output) и, если она выключена, включите её.
    // проверяет значение опции display_errors
    if (ini_get(‘display_errors’) != 1) <
    // включает вывод ошибок вместе с результатом работы скрипта
    ini_set(‘display_errors’, 1);
    >
    Если вдруг сообщит

    Крайне редко удается протестировать программу полностью до выпуска и в то-же время лучше не показывать пользователю сообщения об ошибках ибо его реакция на них непредсказуема. Лучше перенаправлять ошибки транслятора, которые произошли непосредственно во время работы программы, в log файл ошибок. Включить это перенаправление можно опцией log_errors в файле php.ini.

    Полезно также поставить свой обработчик ошибок, если Вы хотите не только заносить ошибки в Log файл но и добавить некоторую дополнительную логику их обработки. Например, отправить письмо при сообщении транслятора или вывести некоторое специальное сообщение для пользователя. Подробнее об этом написано в статье Ловля ошибок в PHP, которую написал Антон Довгаль.
    Сравниваем константу с переменной, а не наоборот

    Сколько раз Вам приходилось выяснять, что ошибка в программе связанна с использованием оператора «=» вместо «==»? Что бы приходилось реже, используйте сравнения вида
    if (10 == $i) <
    // что-то делаем
    >

    В случае использования «=» вместо «==» транслятор выдаст ошибку «Parse error: parse error in . on line . «. Таким образом ошибка обнаруживается значительно быстрее.
    Не используем значение дважды

    Конечно, это преувеличение. Но если в программе возникает необходимость использовать значение несколько раз, можно порекомендовать объявить константу и использовать её вместо значения.

    Для PHP4 существует единственный способ объявить константу — использовать функцию define.

    Например:
    define (‘BEFORE_RENDER’, ‘beforeRender’);

    Констант в классах объявлять нельзя.

    Расширение PHP 5 для определения констант сходно с тем, которое было осуществлено при расширении от C до C++ — используется ключевое слово const. Но константы таким образом можно создавать только внутри классов.

    Например:
    class ControlEvents <
    const BEFORE_RENDER = ‘beforeRender’;
    >
    print ControlEvents::BEFORE_RENDER;

    Но для обращения к такой константе необходимо знать имя класса.

    Константы могут быть также добавлены непосредственно в класс. Но PHP не поддерживает такой метод. Поэтому придется объявить их как обычные переменные:
    class Control <

    var $BEFORE_RENDER = ‘beforeRender’;
    function render() <
    $eventFunction = $this->BEFORE_RENDER;
    $this->$eventFunction();
    >
    >
    Проверка параметров функции

    В PHP параметром в функцию можно передать любую переменную. Но вот алгоритму функции может быть вовсе не все равно, что за переменную ему передали. Поэтому в начале функции полезно проверять её входные параметры на необходимый тип и диапазон значений.

    Для проверки типа используются следующие функции:
    gettype(Mixed $var) — возвращает тип переменной.
    Наиболее часто используемые типы: «boolean», «integer», «double», «string», «array», «object», «resource», «NULL».
    Функции проверки на тип: is_bool(Mixed $var), is_integer(Mixed $var), is_double(Mixed $var), is_string(Mixed $var), is_array(Mixed $var), is_object(Mixed $var), is_resource(Mixed $var) — возвращают true или false.
    Для определения класса объекта используются функции:
    get_class(Object $obj) — возвращает имя класса, экземпляром которого является obj.
    is_a(Object $obj, String $class) — проверяет, является ли obj экземпляром сласса class или класса, унаследованного от class.

    Для PHP4 не существует автоматического способа проверки параметров функции. Все необходимые проверки необходимо делать самостоятельно.

    Код функции, осуществляющей проверку аргументов, может быть примерно такой:
    /**
    * Функция showControl принимает один параметр $control,
    * этот параметр должен являться классом и являться
    * экземпляром класса HTMLControl либо классом,
    * унаследованным от HTMLControl.
    */
    function showControl(&$control) <
    is_a($control, ‘HTMLControl’) or $control == null or exit(‘Type missmatch.’);
    .
    >

    Достоинство этого метода состоит в том, что можно управлять сообщениями об ошибках и использовать собственный обработчик ошибок. Например, Вы можете использовать следующие функции для проверки параметров:
    function checkParameter(&$var, $class) <
    if (!is_a($var, $ > SFExit(‘Type missmatch.’);
    >

    function SFExit(&$message) <
    print $message . ‘
    ‘;
    $backtrace = debug_backtrace();
    for($i = 0; $i Разделяй и властвуй

    Известный со времен древнего Рима принцип «Разделяй и властвуй» вполне может пригодится при разработке программ на любом языке программирования. В том числе и на PHP. Для реализации этого принципа разделяйте программу на логические блоки. Для этого можно воспользоваться следующими методами:

    Использование функций.
    Выносите структурные части алгоритма в функции. Проверяйте каждую часть отдельно и затем работу всего алгоритма в целом.

    Использование классов.
    Организуйте программный код в виде объектов, взаимодействующих друг с другом. Выделяйте сущности и оформляйте их в виде объектов. Внимательно рассматривайте, как они взаимодействуют друг с другом. Используйте, где это разумно, лучшие шаблоны проектирования (design patterns).

    Разделяйте логику и HTML.
    Для этого существует множество способов: темплейтные библиотеки, XML, XML/XSL. Подберите для себя наилучший и используйте.

    Разделяйте логику самого приложения при помощи enterprise design patterns.
    Используйте разделение приложения на уровни (layering) и другие технологии, позволяющие структурно разделить проект на крупные блоки.
    Заключение

    Возможно, кому-то материал статьи покажется сбором прописных истин. Но я думаю, что большинству он все-таки пригодится, а для начинающих программистов последний раздел «Разделяй и властвуй» может оказаться особенно полезным, поскольку задает направление изучения программирования.

    Если у Вас есть комментарии или собственные приемы работы, которые не упомянуты в этой статье, я буду рад услышать и обсудить их с Вами.

    Опубликовал Kest Ноябрь 06 2008 00:38:17 · 0 Комментариев · 6278 Прочтений ·

    • Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •

    Комментарии
    Нет комментариев.
    Добавить комментарий

    Рейтинг доступен только для пользователей.

    Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

    Вы не зарегистрированны?
    Нажмите здесь для регистрации.

    Забыли пароль?
    Запросите новый здесь .

    Добавить комментарий
    Рейтинги