Возможно вы искали: 'La Grande Armee at Aus...'

May 31 2025 02:12:31
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96425698
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18407
• Обзор The Walking ... 18853
• Обзор DMC: Devil M... 19921
• Обзор на игру Valk... 15921
• Обзор на игру Stars! 17810
• Обзор на Far Cry 3 18000
• Обзор на Resident ... 16063
• Обзор на Chivalry:... 17561
• Обзор на игру Kerb... 18021
• Обзор игры 007: Fr... 16667
Превью о играх
• Превью к игре Comp... 18003
• Превью о игре Mage... 14502
• Превью Incredible ... 14763
• Превью Firefall 13523
• Превью Dead Space 3 16378
• Превью о игре SimC... 14772
• Превью к игре Fuse 15479
• Превью Red Orche... 15589
• Превью Gothic 3 16388
• Превью Black & W... 17402
Главная » Статьи » Разное » Пишем PHP код, устойчивый к ошибкам (php )

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

Ключевые слова: php, (найти похожие документы)

From: Александр Неткачев <alex@devlink.crimea.ua>
Newsgroups: email
Date: Mon, 17 Mar 2004 14:31:37 +0000 (UTC)
Subject: Пишем PHP код, устойчивый к ошибкам


Оригинал статьи находится на http://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 (http://php.net/manual/en/ref.errorfunc.php).

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

// Для PHP5
error_reporting(E_ALL | E_STRICT);

Если ни о чем не сообщает
-------------------------

Если Вы установили вывод ошибок, но ничего не выводится, то проверьте
значение опции ini файла, включаещей вывод ошибок непосрественно в
script output - display_errors.

print ini_get('display_errors'); // выводит текущее значение опции display_errors
ini_set('display_errors', 1); // включает вывод ошибок вместе с результатом работы скрипта


Если вдруг сообщит
------------------

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

Полезно также поставить свой обработчик ошибок, если Вы хотите не
только заносить ошибки в Log файл но и добавить некоторую
дополнительную логику их обработки. Например, отправить письмо при
сообщении транслятора. Подробнее об этом написано в статье Ловля
ошибок в PHP, которую написал Антон Довгаль.
(http://detail.phpclub.net/article/2002-10-03)


Сравниваем константу с переменной, а не наоборот
------------------------------------------------

Сколько раз Вам приходилось выяснять, что ошибка в программе связанна
с использованием оператора "=" вместо "=="? Что бы приходилось реже,
используйте сравнения вида

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, $class) && $var != null)
SFExit('Type missmatch.');
}

function SFExit(&$message) {
print $message . '
';
$backtrace = debug_backtrace();
for($i = 0; $i < count($backtrace); $i++) {
print $i . ': ' . $backtrace[$i]['file'] . '(' . $backtrace[$i]['line'] . ')
';
}
exit();
}

Примечание: Функция debug_backtrace введена только в PHP 4.3.0.

Пример их применения:

function showControl(&$control) {
checkParameter($control, 'HTMLControl');
...
}

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

function showControl(HTMLControl $control) {
...
}


Asserts
-------


Во время создания и отладки программы можно использовать встроенный
механизм добавления проверок в код программы. Он называется
asserts (или assert-проверки). Идея его состоит в том, что в код
программы добавляются специальные проверочные конструкции, которые
можно отключить для production сайта, но в любой момент включить при
разработке.

Следующие фрагменты кода примерно аналогичны:

/* Использование Asserts */
assert_options (ASSERT_ACTIVE, 1);

function showControl(&$control) {
assert('is_a($var, 'HTMLControl') || $var == null');
...
}

/* Использование if конструкций */
define('ASSERT_ACTIVE', 1);
function showControl(&$control) {
if (ASSERT_ACTIVE && !(is_a($var, 'HTMLControl') || $var == null'))
trigger_error('Assertion failed', E_USER_ERROR);
...
}

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


Проверять значения параметров скрипта $_REQUEST, $_GET, $_POST, $_COOKIES.
--------------------------------------------------------------------------

PHP скрипт можно рассматривать как большую функцию, которая вызывается
с неопределенным списком string параметров. Если предполагается, что
некоторые параметры будут использоваться в некоторых вычислениях, или
отправляться в базу данных, то их обязательно надо преобразовывать к
требуемому типу и использовать только после явного приведения!

Все массивы REQUEST являются является обычными массивами, поэтому
значения в них могут быть переопределены непосредственно.

Например:

if (isset('id', $_GET))
$_GET['id'] = (int)$_GET['id'];
else
$_GET['id'] = null;


Разделяй и властвуй
-------------------

Известный со времен древнего Рима принцип "Разделяй и властвуй" вполне
может пригодится при разработке программ на любом языке
программирования. В том числе и на PHP. Для реализации этого принципа
разделяйте программу на логические блоки. Для этого можно
воспользоваться следующими методами:
* Использование функций. Выносите структурные части алгоритма в
функции. Проверяйте каждую часть отдельно и затем работу всего
алгоритма в целом.
* Использование классов. Организуйте программный код в виде
объектов, взаимодействующих друг с другом. Выделяйте сущности и
оформляйте их в виде объектов. Внимательно рассматривайте, как они
взаимодействуют друг с другом. Используйте, где это разумно,
лучшие шаблоны проектирования (design patterns).
* Разделяйте логику и HTML. Для этого существует множество способов:
темплейтные библиотеки, XML, XML/XSL. Подберите для себя наилучший
и используйте.
* Разделяйте логику самого приложения при помощи enterprise design
patterns. Используйте разделение приложения на уровни (layering) и
другие технологии, позволяющие структурно разделить проект на
крупные блоки.

Заключение
----------

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

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

Также хочу выразить признательность участникам клуба http://phpclub.ru за
помощь в написании статьи.

Ссылки:
-------

http://php.net/manual/en/function.error-reporting.php
http://php.net/manual/en/configuration.php
http://php.net/manual/en/ref.errorfunc.php
http://php.net/manual/en/function.define.php
http://php.net/manual/en/function.gettype.php
http://php.net/manual/en/function.is-bool.php
http://php.net/manual/en/function.is-integer.php
http://php.net/manual/en/function.is-double.php
http://php.net/manual/en/function.is-string.php
http://php.net/manual/en/function.is-array.php
http://php.net/manual/en/function.is-object.php
http://php.net/manual/en/function.is-resource.php
http://php.net/manual/en/function.get-class.php
http://php.net/manual/en/function.is-a.php
http://php.net/manual/en/function.debug-backtrace.php
http://php.net/manual/en/function.assert.php
314 Прочтений •  [Пишем PHP код, устойчивый к ошибкам (php )] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Пишем PHP код, устойчивый к ошибкам... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка