21 ошибка программиста PHP


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

PHP. 25 вопросов, задаваемых на собеседовании

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

Вопрос на собеседовании по PHP №1: «В чем разница между конструкциями include() и require() ?»

Конструкция include , в отличие от require , позволяет включать файлы в код PHP скрипта во время выполнения сценария.Поясним это на примере, попробовав подключить 5 файлов 1.txt, 2.txt. 5.txt. Содержимое файлов — десятичные цифры от 1 до 5 (по одной цифре в каждом файле). Создадим следующий PHP-сценарий:

Т.е. каждый из файлов был включен по одному разу прямо во время выполнения цикла! Если же мы напишем require вместо include , то возникнет критическая ошибка (fatal error).

Отличие include от require также заключается в том, что require выдает Fatal error при невозможности подключения файла по любой причине. include выдаст Warning и продолжит работу.

Вопрос на собеседовании по PHP №2: «Как мы можем получить IP-адрес клиента?»

Этот вопрос может показать интервьютеру, насколько изобретателен и креативен кандидат, т.к. ответов может быть множество. Код $_SERVER[«REMOTE_ADDR»]; является самым простым решением, но вы можете написать настоящий сценарий, отвечая на этот вопрос.

Вопрос на собеседовании по PHP №3: В чем разница между unset() и unlink() ?

unset() устанавливает переменную в “ undefined ”, в то время как unlink() удаляет файл, который отправляется из файловой системы.

Вопрос по PHP №4: что выведет на экран следующий код:

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

Вопрос с собеседовани по PHP №5: Каковы основные типы ошибок в PHP и чем они отличаются?

В PHP существует три основных типа ошибок:

Notices (замечания) Простые, некритические ошибки, которые произошли во время выполнения сценария. Примером Notices возникновения будет обращение к неопределенной переменной. Warnings (предупреждения) Более серьезные ошибки, чем Notices, однако выполнение сценария не прервется. Примером может быть подключение не существующего файла с помощью include() . Fatal (критические) Этот тип ошибки вызывает прекращение выполнения сценария. Примером фатальной ошибки будет доступ к свойству несуществующего объекта или require() несуществующего файла.

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

Вопрос, который можно услышать на собеседовании по PHP №6: В чем разница между GET and POST ?
  1. GET отправляет данные как часть URL, в то время как при POST эта информация не показывается, поскольку кодируется в запросе.
  2. GET может обрабатывать максимум 2048 символов, POST не имеет таких ограничений.
  3. GET работает только с ASCII данными, POST не имеет таких ограничений, двоичные данные также допускается.
  4. Обычно GET используется для получения данных, а POST для добавления и обновления.

Понимание основ протокола HTTP очень важно для хорошего старта в качестве разработчика PHP и различия между GET и POST являются неотъемлемой его частью.

Вопрос №7: Как вы включить сообщения об ошибках в PHP?

Установите display_errors = on в php.ini или объявите ini_set(‘display_errors’, 1) в вашем сценарии. Затем, добавьте error_reporting(E_ALL) в ваш код, чтобы отобразить все типы сообщений об ошибках во время выполнения скрипта.

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

Вопрос №8: Что такое Трейты (Traits)?

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

Очень важно, чтобы разработчик знал мощные возможности языка(ов), с которыми он работает и Трейт является одним из таких признаков.

PHP-вопрос, который могут задать №9: Может ли значение константы измениться во время выполнения скрипта?

Нет, значение константы не может быть изменено, если она уже была объявлена в ходе выполнения PHP-кода.

Вопрос №10: Можно ли вы расширить определенный класс Final ?

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

Вопрос №11: Что делают методы __construct() и __destruct() в PHP-классе?

Все объекты в PHP имеют встроенные методы конструктор и деструктор. Метод Конструктор вызывается сразу после того, как создается новый экземпляр класса и он используется для инициализации свойств класса. Метод Деструктор не принимает никаких параметров.

Понимание этих двух PHP-методов означает, что кандидат знает основы объектно-ориентированного программирования в PHP.

Вопрос №12: Как мы можем получить количество элементов в массиве?

Функция count() используется для возвращения количества элементов в массиве.

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

“Мне бы хотелось, чтобы младший PHP-разработчик знал основы программирования и то, как применить их к PHP. Мне не нужно, чтобы он знал все функции и термины по названиям.”

Вопрос №13: Как бы вы объявили функцию, которая принимает один параметр hello ?

Если hello = true , то функция должна напечатать hello , но если функция не получает hello или hello = false , то функция должна напечатать bye .

В этом вопросе, интервьюер может оценить знает ли разработчик как объявить функцию и как он будет определять, может ли параметр быть вызван той или иной функцией. Интервьюер может также оценить знает ли разработчик синтаксис if и, если знает, как напечатать text(echo function) .

PHP-вопрос №14: Значение переменной $input представляет собой строку вида 1,2,3,4,5,6,7 . Как подсчитать сумму чисел в этой строке?

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

PHP Вопрос №15: Предположим, что у вас есть форма подпики на рассылку.

Эта форма имеет только одно текстовое поле input name=»email» . Как проверить является ли поле пустым и вывести сообщение «Электронная почта не может быть пустой» в этом случае.

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

Вопрос №15: Работа с классами

Реализуйте класс с именем Dragonball с атрибутом ballCount , равным нулю, и метод iFoundaBall . Когда вызывается iFoundaBall , то ballCount увеличивается на единицу. Если значение ballCount равно семи, то должно появиться сообщение «Загадайте желание«, а ballCount снова станет равен нулю.

Этот вопрос будет оценивать знание кандидатом объектно-ориентированного программирования.

PHP Вопрос №16: Какие есть 3 области видимости в PHP ?

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

PHP Вопрос №17: Что такое геттеры и сеттеры и для чего они нужны?

Геттеры и сеттеры – это методы, используемые для объявления или получения значений переменных, и, как правило приватных. Они важны, т.к. позволяют центральному расположению обрабатывать данные, объявляя и выводя их. Внутри геттера или сеттера вы можете последовательно обрабатывать данные, которые в конечном счете будут переданы в переменную или дополнительные функции. Примером этого может быть имя пользователя. Если вы не используете сеттера и просто объявите переменную $userName вручную, чтобы у вас появился результат, например: «kevin» , «KEVIN» , «KeViN» , «» и т.д. С сеттером вы можете не только изменить значение, например, ucfirst($userName) , но вы также можете обрабатывать ситуации, когда данные не валидны, например, когда «» пропущено. То же самое относится и к геттерам — когда данные возвращаются, вы можете изменить результаты, чтобы включить strtoupper($userName) для правильного форматирования в дальнейшем.

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

Вопрос с собеседования №18: Что означает MVC и что делает каждый компонент?

MVC расшифровывается как Model (Модель) View (Представление) Controller (Констроллер).

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

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

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

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

Вопрос с собеседования №19: Каким образом можно предотвратить появление следующего предупреждения ‘Warning: Cannot modify header information – headers already sent’ (Внимание: Не удается изменить информацию в заголовке — заголовок уже отправлен) и почему оно появляется на первом месте?

Ничего не выводите в браузер до использования кода, который преобразует HTTP-заголовки. После того, как вы вызовите echo или любой другой код, который очищает буфер, вы больше не сможете присваивать «куки» или заголовки. Это также подходит к сообщениям об ошибках, поэтому если ошибка появляется до того, как вы используете команду заголовка и INI-директива display_errors установлена, это также выведет сообщение об ошибке.

Вопрос №20: Что такое SQL-инъекции и каковы наиболее эффективные методы их предотвращения?

SQL-инъекции являются методом are a method to изменения a запроса в SQL-операторе, отправленном на сервер базы данных. Этот измененный запрос затем может пропускать такую информацию, как логин\пароль, и может поспособствовать хакерам подвергнуть сервер угрозе.

Чтобы предотвратить инъекции SQL необходимо постоянно проверять и удалять все вводимые пользователем данные. В PHP это часто забывается из-за простоты доступа к $_GET и $_POST , а также из-за невнимательности начинающих разработчиков. Но также существует множество методов, с помощью которых пользователи могут манипулировать переменными, используемыми в SQL, через файлы «cookies» и даже загруженные файлы. Единственный настоящий способ защиты – постоянное последовательное использование заготовленных операторов.

Не используйте устаревшие (начиная с PHP 5.5) mysql_* функции, а использовуйте PDO, т.к. оно позволяет использовать серверы, отличные от MySQL. Допускается также использование mysqli_* но в наши дни нет особого смысла не использовать PDO, ODBC или DBA. В идеале можно использовать Doctrine или Propel, чтобы избежать написания SQL-запросов всех вместе, а использовать маппинг, относящийся к объектам, который связывает строки из базы данных с объектами вашего приложения.

Вопрос №21: Что делает следующий код?

Выведет 7 . Ведущий нуль в PHP указывает на восьмеричное число, поэтому $i вычисляется как десятичное число, равное 14, а не 16.

Вопрос №22: Почему используют === вместо == ?

Если вы хотите проверить какой-то определенный тип, например, целое число или логическое значение, то === будет делать именно то, что ожидается от конкретно набранной команды, в то время как == будет конвертировать данные лишь на время и попытается сопоставить оба типа операндов. Тождественный оператор ( === ) работает быстрее, поскольку не приходится иметь дело с преобразованием типов. Особенно при проверке переменных на истина\ложь лучше избегать == т.к. 0/1 или другая похожая форма также будет принята в расчет.

Вопрос №23: Что такое PSR?

PSR является набором рекомендаций по стандартам PHP, которые направлены на стандартизацию общих аспектов PHP-разработок. Примером PSR является PSR-2, который является своеобразным гидом по стилям кодирования.

Вопрос №24: Какому PSR стандарты вы следуете? Почему нужно следовать стандарту PSR?

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

Вопрос №25: Используете ли вы Composer? Если да, то какие преимущества вы нашли в нем?

Использование Composer’а – это инструмент для управления зависимостями. Вы можете объявлять библиотеки, с которыми работаете, а Composer займется их установкой и обновлением. Еще одним преимуществом является последовательный метод управления библиотеками, с которыми вы работаете, так что вы потратите меньше времени на это самое управление, занимаясь своим проектом.

20 вещей, которые отличают PHP-программиста от обезьянки

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

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

Мастер Йода рекомендует:  Книги по программированию как читать и что именно

Используйте и прочие способы размещения в файле php-скриптов. Да, может быть, у вас все работает, а вот на другом сервере — не факт. На некоторых серверах короткие тэги вообще отключены. Не рискуйте, используйте только . И кстати, не ставьте закрывающий php-тег — это признак дурного тона. А еще закрывающий тэг в конце может привести к неожиданным проблемам, связанным со случайно поставленным пробелом или переводом строки в конце вывода.

Отделяйте файлы с параметрами

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

Комментарии — ваши друзья

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

Правда, просто? Еще стоит обратить внимание на PHPDoc.

Грамотно форматируйте код

Нет ничего хуже огромной стены кода, автор которого явно не знал о существовании кнопки Tab. Не спасут даже комментарии — отступы придумали для того, чтобы логически отделять друг от друга фрагменты кода. А использование или неиспользование отступов много говорит о вас как о программисте. Вот этот код отформатирован неправильно:

А вот это — тот же самый код, но с правильным форматированием:

Если вы хотите точно знать, какой способ форматирования кода правильный — почитайте PSR-ы.

Давайте переменным понятные имена

Конечно, к единому мнению по этому вопросу прийти нельзя. camelCase или under_score? Нужна ли Венгерская нотация? Важно здесь одно: раз и навсегда определитесь, что вам ближе. А даже если вам и захочется изменить стиль, то пожалуйста, не делайте это посреди проекта! Разные варианты именования переменных в одном проекте или, что еще хуже, в одном файле — это ужасно. И никаких магических чисел! Не поленитесь использовать константы.

Инициализируйте переменные

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

Булева переменная ложна, иначе — истинна

Если вы проверяете какое-то условие и потом результат сравнения сохраняете в булевом значении, при инициализации переменной для результата (мы ведь всегда заранее инициализируем переменную, помните?) сначала присваивайте ей false . То есть вот так делать не надо:

Зачем это? Представьте, что вы проверяете данные перед запросом к базе. Если по какой-то причине блок if вдруг не выполнится, то значение переменной останется false — так вы подстрахуете себя от попадания в базу ошибочных данных. В коде порой приходится иметь дело с конфиденциальными данными, так что лучше сначала исходить из того, что все данные ошибочны, пока не доказано обратное. Это правило практически написано кровью.

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


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

В коде разных разработчиков можно увидеть два варианта доступа к элементам ассоциативного массива:

Во время выполнения второго варианта PHP сначала попытается найти константу с именем marc . И только если такой не найдется, marc будет сконвертировано в строку и передано в таком виде. Лучше не думать о том, что может случиться, если вдруг такая константа будет существовать… Всегда ставьте кавычки, чтобы такого не происходило.

Используйте запятые, чтобы обратиться к нескольким строкам в одном вызове

Если вам надо, например, в одном вызове функции обратиться к значению переменной и к строке, лучше используйте запятые, а не точки. Почему? Точка — оператор конкатенации строк, эта операция будет выполняться медленнее. Доказательство.

Еще раз. Так надо:

echo «Hello, my name is «, $name;

А вот так — не надо:

echo «Hello, my name is » . $name;

Пользуйтесь тернарными операторами

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

Но можно записать его и так:

Обобщенно тернарный оператор работает следующим образом:

Используйте для сравнения с булевыми значениями строгое сравнение

Если вы проверяете переменную на true или false , используйте === , а не == , которое задействуется в остальных сравнениях. Строгое сравнение из трех знаков равенства сравнит еще и типы переменных.

Используйте инкремент и декремент

Если вам нужно просто увеличить или уменьшить на 1 значение переменной, ни к чему писать эту громоздкую конструкцию:

Куда лаконичнее такой вариант:

А главная прелесть этих операций — в том, что одновременно с ними можно выполнять еще какое-нибудь действие (например, if или while ). В зависимости от того, написано ли — или ++ до или после самого названия переменной, очередность операций изменяется.

Используйте сокращенные операторы присваивания

Если переменную надо увеличить или уменьшить на число, не равное 1, то и в этом случае код можно сократить. Например, у вас в коде может быть такое:

А используя сокращенные операторы, этот же код можно будет записать так:

Со строками, кстати, это тоже работает. Если понадобится присоединить к существующей строке какую-то часть, сделайте это так:

Создайте отдельную функцию для var_dump

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

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

Но лучше всего забыть этот совет и научиться пользоваться XDebug.

Пользуйтесь константами

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

Пользуйтесь $_GET и $_POST

$_REQUEST лучше не использовать. Четко разделяйте данные: $_GET — это параметры, переданные из адресной строки, $_POST — это, например, полученные из формы данные. И не вздумайте передавать в скрипт пароли, особенно незашифрованные, GET-запросом!

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

Используйте объекты, а не функции

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

Вызывайте методы цепочками

Если вы подряд вызываете несколько методов одного объекта, имеет смысл сократить код, не выписывая каждый раз название этого объекта. Если есть вот такой класс:

… то обращаться к его методам можно так:

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

Не повторяйте себя

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

4 октября 2020 – 1 марта 2020, Москва и онлайн, беcплатно

Помощь нашим читателям

Семь основных ошибок PHP программиста

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

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

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

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

Часть 1: Описываются 7 «детских» ошибок (#21-15, в обратном порядке, в соответствии со степенью серьёзности по нашей классификации). Такие ошибки не вызывают серьёзных проблем, но приводят к уменьшению эффективности работы программы, а также выражаются в громоздком трудночитаемом коде, в который, к тому же, трудно вносить изменения.

Часть 2: Следующие 7 ошибок (#14-8) относятся к «серьёзным». Они ведут к ещё более значительному уменьшению скорости выполнения кода, уменьшению безопасности скриптов; код становится еще более запутанным.

Часть 3: Описания семи, последних, «смертельных» ошибок. Эти ошибки концептуальны по своей природе и являются причиной появления ошибок, описанных в 1-ой и 2-ой частях статьи. Они включают и такие ошибки, как недостаточное внимание, уделённое как проекту в целом, так и коду программы, в частности.

14. ПРЕНЕБРЕЖЕНИЕ ПРАВИЛАМИ ПРИСВОЕНИЯ ИМЁН

Одна из наиболее серьёзных ошибок программиста — непродуманная система именования переменных проекта. Нередко приходится тратить уйму времени на разбор кода только потому, что автор вдруг решил ввести в программу переменные $fred и $barney вместо ожидаемых $email и $name. Речь ведётся о реальном проекте, где не менее реальный программист решил все переменные проекта назвать именами героев мультсериала «Flinstones» (Это не шутка). То как вы назовёте переменные и функции программы, определит во многом читаемость её кода. Наиболее распространёнными ошибками являются имена:

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

В PHP имена переменных регистрозависимы, то есть $user и $User — две записи в списке переменных скрипта. Однако некоторые программисты активно пользуются этим и производят на свет переменные с совершенно одинаковыми именами, но использующими буквы разных регистров. Это отвратительная привычка. Регистр букв никогда не должен быть единственным отличием двух переменных. Каждая переменная на своём поле действия должна иметь уникальное имя.

Слишком короткие имена

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

Слишком длинные имена

С другой стороны, наблюдаются случаи злоупотребления длинными именами. Наиболее общее правило: имя переменной должно состоять максимум из двух слов. Разделить эти два слова мы можем, поставив understrike (то есть «_») или написав второе слово с заглавной буквы.

Пример #1. Положительный.

Как правильно присваивать имена переменным:

$username = ‘sterling’;
$password = ‘secret’;
$teachers = array (‘Sadlon’,
‘Lane’,
‘Patterson’,
‘Perry’,
‘Sandler’,
‘Mendick’,
‘Zung’);
foreach ($teachers as $teacher);

Пример #2. Отрицательный.

Теперь рассмотрим несколько преувеличенные примеры того, как не следует присваивать имена переменным:

$username_for_database = ‘sterling’;
$guMbi = ‘secret’; // for the $password
$thelastnamesofteachers = array (‘Sadlon’,
‘Lane’,
‘Patterson’,
‘Perry’,
‘Sandler’,
‘Mendick’,
‘Zung’);
foreach ($thelastnamesofteachers as
$TeaChER);

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

Помните, что в PHP все функции, встроенные или определённые разработчиком, — регистронезависимы.

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

В качестве примера рассмотрим функцию, генерирующую Гауссовы случайные числа. Предполагается, что из её имени мы должны понять, какая именно формула используется в генерации числа. Вот так: generate_gaussian_rand().

Обратите внимание на использование глагола в имени функции. Именно глагол помещает функцию в правильный контекст:

Для сравнения, другой пример:

Видите разницу? Во втором примере для обозначения действия использовано существительное. И если назначение функции ещё прослеживается, название затрудняет чтение кода.

Мораль: используйте глаголы!

13. НЕПРОДУМАННАЯ РАБОТА С ДАННЫМИ: БД И SQL

Забавно иногда наблюдать, сколько разных уловок находят люди для организации доступа к базам данных и получения выборки результатов. Среди прочих особенно выделяются комбинации из веток if, циклов do..while, множественных запросов и вызовов функции sql_result() внутри цикла for. Чем, на их взгляд, они занимаются? Код, основанный на методе научного тыка, говорит о недостаточно ясно определённой организации работы с БД. Те, кто прилагают все свои усилия на написание кода, а не на написание правильного кода, рискуют больше потерять, чем заработать. Некорректная выборка данных — яркий тому пример. Некоторые программисты не уделяют достаточно времени на тщательное продумывание этого момента. Естественно, в реальной жизни может и не оказаться того «единственно верного» способа выборки данных, но всегда найдётся тысяча «неверных», это точно. Ошибки в организации выборки данным можно разделить на три класса:

  • неправильное использование функций обращения к БД
  • ошибки SQL: запрашивается не то, что нужно
  • обработка результатов выборки средствами PHP

Неправильное использование функций обращения к БД

Один из PHP-исходников предлагал следующий способ получения выборки из БД (приведённый ниже код в проекте находится после сгенерированных SQL-запросов):

if (!($row = sql_fetch_row ($result))) <
print «Ошибка: не найдено ни одного ряда»;
exit;
>
do <
print «$row[0]: $row[1]\n
\n»;
>
while ($row = sql_fetch_row ($result));

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

Проверка на «ноль рядов» ($result): неправильный подход

Задействовав функцию sql_fetch_row(), данный кусок кода предлагает косвенную проверку выборки на наличие хотя бы одного ряда данных. Но ведь существует прямой способ — это подсчёт количества рядов в выборке $result функцией sql_num_rows(), как показано ниже:

Избавляемся от do..while

Прежде всего, исчезает необходимость в использовании давно уже поднадоевшего do..while, ибо для проверки на «ноль рядов» функция sql_num_row() не выдёргивает первый рядв $row, и указатель по-прежнему установлен на начало.

В PHP Source как-то был представлен подобный фрагмент кода. Если выборка не была нулевой, то функция sql_fetch_row() внутри условного блока доставляла первый ряд. Для получения остальных приходилось прибегать к do..while, потому что получение ряда из выборки («to fetch» — принести, доставить// Прим. перев.) смещает указатель в ней. Таким образом, сначала вам придётся обработать уже полученный ряд («do»), только потом получить второй ряд и так далее.

Так чем же do..while так провинился?

  • в данном примере внутри цикла do..while помещён только один оператор: простой вывод. Теперь представим, что там может оказаться не один, а десять операторов. Тогда редактору кода придётся искать условие while после оператора do и целого блока действий внутри цикла. Занятие не из приятных.
  • условие while обычно располагается в начале блока, а не в конце его. Поэтому редактору кода нужно будет уделять этому особое внимание при чтении, чтобы не спутать цикл do..while с предварительным условием while обычного цикла.

Делаем всё просто и понятно

В случае получения нулевой выборки, функция sql_num_row() в отличие от sql_fetch_row() делает именно то, что вам нужно сделать:


  • действие sql_fetch_row(): «При попытке получить первый ряд не найдено ни одного ряда. Это может
  • означать, что в данной выборке их нет».
  • Действие sql_num_row(): «Количество рядов в выборке равно нулю».

Но как это отражается на написании кода?

Рассмотрим следующий пример, где операторы внутри условия записаны псевдокодом:

  • if(!($row = sql_fetch_row($result))):
  • Получаем первый ряд из выборки.
  • Если выборка пустая, то переменной $row приписываем 0; ноль логически выражается False; отсюда
  • !(0)=True; выводим сообщение об ошибке.
  • Иначе, если выборка не пустая, получаем первый ряд, приписываем его переменной $row; $row не равно
  • нулю, то есть True; !(True)=False; выходим на цикл do..while.
  • If(sql_num_rows($result)

Получение рядов данных: правила эффективной работы

Вторая проблема нашего кода — это использование функции sql_fetch_row() для получения рядов. Как результат своей работы эта функция возвращает лишь пронумерованный массив. Однако существует ещё и функция sql_fetch_array(), которая возвращает два массива: пронумерованный и ассоциативный:

$row = sql_fetch_array ($result);
print $row[1]; // Второй столбец
print $row[name]; // Столбец name — имя

Примечание: Существуют разные точки зрения на целесообразность использования одинарных кавычек при вставке строковых аргументов. В приведённом примере (столбец name) и далее по статье они не используются.

Какая из функций более удобна для разработчика? Ассоциативные массивы позволяют редактору кода ясно и однозначно понять, какая именно выборка из БД будет осуществляться в каждом конкретном случае. Например:

Итак, функция sql_fetch_row() имеет целую тонну недостатков. Однако, существует ситуация, где её можно поставить без всякого ущерба «прозрачности» кода: когда sql-запрос формируется пользователем.

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

Здесь для их эффективной обработки полезно использовать функцию sql_fetch_row() в сочетании с count():

Ошибки SQL: запрашивается не то, что нужно

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

Язык Структурированных Запросов (SQL) был специально разработан для запросов и получения данных из таблиц в БД. Идея языка заключается в отсеивании данных ненужных вам (средствами SQL) и получении только тех, которые вам действительно необходимы для дальнейшей обработки (например, средствами PHP).

Если вы заметили, что получаете в выборке данных, больше, чем вам нужно, это верный признак недоработанных SQL-запросов.

Классический пример эффективного применения SQL-запросов — использование условия WHERE в синтаксисе SQL.

Рассмотрим пример кода, производящего выборку и выводящего список имён и телефонов всех пользователей с id равным 5:

Данный код имеет следующие недоработки: для поиска по всей БД используется PHP; при работе с БД малого размера на это можно и не обращать внимания, но с ростом БД вы обязательно заметите резкое падение скорости работы скриптов.

Выход прост: включите в SQL-запрос условие WHERE:

$statement = «SELECT name, phone FROM samp_table»;
$statement .= » WHERE «;

WHERE позволит применить более строгие критерии выборки. Фильтром в данном случае будет являться значение аргумента. В нашем примере это » >

Получив нужную вам выборку, вы используете PHP для простого вывода результатов:

if (@sql_num_rows ($result) != 1) <
die («Получено неверное количество рядов»);
>
$row = @sql_fetch_array ($result);
print «Имя: $row[name]\n
\n»;
print «Телефон: $row[phone]\n
\n»;

Обработка результатов выборки средствами PHP

Нередко программист намеренно не сортирует выборку при запросе, перекладывая эту работу на PHP. Такой подход неэффективен, ибо сортировка средствами SQL проходит намного быстрее, чем в PHP.

Для сортировки результатов рекомендуем применять синтаксис SQL (ORDER BY), а не PHP-функцию ksort().

Рассмотрим пример использования ksort() для сортировки выборки по имени (name):

$statement = «SELECT name, email, phone FROM some_table «;
$statement .= «WHERE name IS LIKE ‘%baggins'»;
$result = @sql_db_query ($statement, «samp_db», $conn);
if (!$result) <
die (sprintf («Ошибка [%d]: %s»,
sql_errno (),sql_error ()));
>
while ($row = @sql_fetch_array ($result)) <
$matches[ $row[name] ] = array ($row[email],
$row[phone]);
>
ksort ($matches);

Возникает вопрос: а почему бы ни провести сортировку результатов во время выборки? Это избавит нас от необходимости проходить по всему массиву с результатами дважды.

Итак, убираем ksort() и исправляем SQL-запрос, добавив ORDER BY:

$statement = «SELECT name, email, phone FROM some_table «;
$statement .= «WHERE name IS LIKE ‘%baggins’ ORDER BY name»;

12. СЛАБАЯ УСТОЙЧИВОСТЬ К ОШИБКАМ

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

Любой скрипт может «свалиться» при наступлении каких-либо «критичных» условий. Чтобы свести такой риск к минимуму всегда нужно:

  • проверять результаты вызова функций;
  • проверять результаты системных вызовов;
  • в файле php.ini устанавливать уровень error_reporting на E_ALL.

Проверка результатов вызова функций

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

В приведённом ниже примере на шестом витке цикла возникает ошибка «деление на ноль», поскольку $i наращивается на 1, а $j уменьшается на 1. На шестом проходе $i=$j=1.

Проверка результатов системных вызовов

При обращении к внешним файлам или процессам всегда проверяйте, всё ли работает корректно.

Блестящий тому пример — проверка ответа системы при вызове функции sql_connect(). Стоит проверить этот ответ и убедиться, что подключение к БД действительно имело место. Если этого не сделать, то все запросы к БД могут не состояться, а некоторые данные могут быть утеряны; вы же будете пребывать в счастливом неведении.

$conn = @sql_connect ($host, $user, $pass);
if (!$conn) <
die (sprintf («Ошибка [%d]: %s»,
sql_errno (), sql_error ()));
>

Установка уровня error_reporting в файле php.ini на E_ALL

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

Обратимся ещё раз к примеру, приведённому в части «Проверка результатов вызова функций». Предположим, что error_reporting выставлен не на максимум, а, скажем, на E_ERROR.

Обратите внимание на то, как скрипт выполняет функцию do_math, но не сообщает об ошибке «деление на ноль», которая, однако, имела место (при $i=$j=0 вывода результата просто не было).

Результат работы скрипта:

Свои обработчики ошибок

Как правило, PHP выдаёт сообщения об ошибках непосредственно в браузер и не позволяет разработчику подавить или перехватить их. Однако в PHP4 у вас появилась возможность перехвата таких сообщений с помощью функции set_error_handler().

Функция set_error_handler() применяется для записи ошибок вашего скрипта. Теперь вы можете перехватывать все ошибки и программировать собственные обработчики — warning’и пользователей больше не побеспокоят.

В следующем примере set_error_handler() назначает обработчиком по умолчанию функцию error_handler(). В \случае возникновения ошибки вызывается error_handler(), и встроенная функция error_log() регистрирует сбой в файле лога error_file.

Если происходит ошибка класса E_ERROR, работа скрипта прекращается и выводится сообщение об ошибке.

11. НЕОПРАВДАННОЕ ИСПОЛЬЗОВАНИЕ ООП

Парадигма ООП — замечательный подход к написанию кода. У ООП есть множество неоспоримых преимуществ, самое значительное из которых — возможность использовать заново уже некогда написанный код. Однако все мы рано или поздно осознаём тот факт, что ‘PHP — не объектно-ориентированный язык’.

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

Несмотря на присутствие основных элементов, PHP всё-таки не хватает многих «продвинутых» функций (как защищённые члены или закрытые переменные), которые обязательны для «настоящих» объектно-ориентированных языков (например, Java, C++).

Кроме того, поддержка объектов в PHP недостаточно отработана и не очень эффективна. Это означает, что использование парадигмы ООП может существенно снизить скорость выполнения программы.

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

А что же мы сможем без ООП?

Если вы пришли в PHP из Java или C++, где без объектов трудно создать что-либо более или менее серьёзное, то и в PHP вам будет трудно обходиться без них. Но будьте уверены, что серьёзные приложения могут быть написаны и методик и приёмов ООП (PHP был написан на C, а последний, как мы знаем, не поддерживает объектов).

Итак, для тех, кто не привык обходиться без ООП, приведём альтернативные технологии написания связных и расширяемых приложений вне парадигмы ООП:

  • Создание API.
  • Разработка концепции именования (и работа в её рамках).
  • Группирование взаимосвязанных функций в один файл.

Соотнесём код программы с тремя уровнями:

  • Первый — собственно рабочие функции.
  • Второй — API функции. Сюда входят функции для построения конкретного приложения.
  • Третий — само приложение:

MortgageRate.php (Ипотечный Кредит):

30000)
return (3.2);
elseif ($total > 50000)
return (2.5);
else
return (1.7);
>
// Уровень второй — API функции
// double calculate_mortgage_rate (int money, int time, int month)
// Рассчитывает процентную ставку исходя из
// суммы займа, времени погашения и интервала
// выплат
function calculate_mortgage_rate ($money, $time, $month)
<
$rate = _mort_find_interest_rate ($money) / 100;
$money /= ($time / $month);
return ($rate * $money) + $money;
>
?>

Разработка концепции именования и работа в её рамках.

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

  • иметь свойства с одинаковыми именами или
  • содержать в себе методы с одинаковыми именами.

Например, класс Phillips и класс Normal могут одновременно содержать метод с именем screwdriver.

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

Группирование взаимосвязанных функций в один файл

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

Например, можно было бы все функции, связанные с общением с БД, собрать в файл DB.php.

ООП, как и всё на свете, хорошо в меру

Небольшая оговорка: эта глава была написана не для того, чтобы отговорить вас от использования ООП вообще. Скорее, это была попытка убедить вас не работать с PHP в режиме Java или C++, где ООП — решение номер один.

Проведите тщательный анализ всех выгод и потерь, прежде чем применить объектный подход в PHP.

10. НЕОПРАВДАННОЕ ИСПОЛЬЗОВАНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ

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

Например, для перевода целой строки в заглавные буквы, новичок в PHP мог бы написать следующее:

Однако, в этом случае, используя тяжеловесный и медленный ereg_replace(), он потратил бы кучу драгоценного времени выполнения на задачу, с которой более лёгкая функция strtoupper() справилась бы намного быстрее $data = strtoupper ($data);

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

Эти функции должен знать каждый

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

strtoupper(); strtolower(); ucfirst(); strtr(); str_replace(); trim(); explode(); implode(); substr(); strcmp()

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

9. ПРОГРАММИРОВАНИЕ НА PHP КАК НА ДРУГОМ ЯЗЫКЕ

Многие приходят в PHP уже с большим опытом программирования в другом языке, как PERL, C, Java или (ну это ещё куда ни шло) ASP. И частенько «импортируют» техники и подходы, которые не всегда хорошо сочетаются с методиками PHP.

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

При таком подходе очень часто на выходе мы получаем медленный и трудно поддерживаемый код. И такие случаи не редкость:

    «однострочники» PERL. PHP — язык мало приспособленный к так называемому методу-«всё в одной строке». Рекомендуем разбивать сложные хитросплетения комбинированных функций и представлять их в более структурированном виде.

PHP
$quote) <
print «$name: «;
print implode (» «, array_reverse (preg_split (‘//’,
$quote)));
print «\n»;
>
@fclose ($fp);
?>

  • Уклонение от встроенных функций: Многие PHP-программисты, пришедшие из C, кажется, не понимают того, что PHP содержит целую армию встроенных функций. Их цель — избавить вас от километровых скриптов. Если вы раньше писали на C, вам настоятельно рекомендуется изучить техническое описание PHP и узнать, какие функции PHP вам может предложить и тем самым облегчить вам жизнь.

  • Переименование стандартных функций PHP: некоторые программисты переименовывают стандартные функции PHP только для того, чтобы легче их запоминать. Это не только снижает скорость выполнения скрипта, но и затрудняет чтение кода.
  • Неоправданное использование ООП: PHP — не объектно-ориентированный язык, хотя некоторая поддержка объектов всё-таки имеется. И всегда стоит помнить, что использование функций поддержки ООП значительно снижает скорость выполнения скрипта.
  • 8. НЕДОСТАТОЧНОЕ ВНИМАНИЕ К ВОПРОСАМ БЕЗОПАСНОСТИ

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

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

    Пример: многие скрипты не используют встроенную PHP-функцию mail(), которая обеспечивает безопасную отправку почты. Вместо этого почта отправляется через программу sendmail с помощью popen(). Это делает код весьма неустойчивым к искажению данных и представляет собой «дыру» в безопасности системы (получателю можно отправить /etc/passwd).

    Перечислим наиболее распространённые «дыры», позволяющие искажать данные:

    • системные вызовы. Никогда нелишне повторить. Каждый раз нужно убедиться, что пользователь отправляет вам «безопасные» данные для системного вызова. НИКОГДА НЕ ДОВЕРЯЙТЕ ДАННЫМ, ПОЛУЧЕННЫМ ОТ ПОЛЬЗОВАТЕЛЯ. И ПРЕЖДЕ ЧЕМ ПОДСТАВИТЬ ИХ В СИСТЕМНЫЙ ВЫЗОВ ПРОВЕРЬТЕ ИХ.
    • регистрация пользователей. Если вы желаете получить корректные результаты, обязательно проверяйте полученные данные, причём, лучше если проверка будет состоять из нескольких этапов. Прежде всего, это проверка адреса электронной почты: убедитесь, что пользователь предоставил вам работающий аккаунт. Кроме того, стоит убедиться, что указанный возраст находится в определённых пределах. Вы можете быть совершенно уверены, что на нашей планете нет двухсотлетних товарищей, которые ещё способны сесть за компьютер.
    • приём номеров кредитных карточек. Некоторые программисты ограничиваются самыми простыми алгоритмами; их легко обмануть. Существуют крупные специализированные организации для проверки кредитных карточек; рекомендуем прибегать к их помощи или ресурсам и только потом решать, принята карточка или нет. НИКОГДА НЕ ПОЛАГАЙТЕСЬ ТОЛЬКО НА АЛГОРИТМЫ.

    Безопасность системных вызовов.

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

    Каждый раз при системном вызове с потенциально небезопасными данными, дезактивируйте их с помощью EscapeShellCmd():

    Примечание: дезактивация проходит путём подстановки бэкслэша («\») перед потенциально небезопасными для системы символами (а именно: #&;?’\»|*?

    Уровни ошибок РНР

    За уровень обработки ошибок в PHP отвечает директива error_reporting конфигурационного файла php.ini . Данный параметр определяет типы ошибок, о которых PHP информирует выводом текстового сообщения в окно браузера.

    Возможные значения директивы

    Уровень ошибки Константа Описание ошибки
    1 E_ERROR Ошибки обычных функций (критичные ошибки)
    2 E_WARNING Обычные предупреждения (не критичные ошибки)
    4 E_PARSE Ошибки синтаксического анализатора
    8 E_NOTICE Замечания (аномалии в коде, возможные источники ошибок — следует отключить при наличии русского текста в коде, так как для интернациональных кодировок не обеспечивается корректная работа).
    16 E_CORE_ERROR Ошибки обработчика
    32 E_CORE_WARNING Предупреждения обработчика
    64 E_COMPILE_ERROR Ошибки компилятора
    128 E_COMPILE_WARNING Предупреждения компилятора
    256 E_USER_ERROR Ошибки пользователей
    512 E_USER_WARNING Предупреждения пользователей
    1024 E_USER_NOTICE Уведомления пользователей
    E_ALL Все ошибки

    Вышеуказанные значения (цифровые или символьные) используются для построения битовой маски, которая специфицирует выводимое сообщение об ошибке. Вы можете использовать битовые операции для маскирования определённых типов ошибок. Обратите внимание, что только ‘|’, ‘

    ’, ‘!’ и ‘\&’ будут понятны в php.ini и что никакие битовые операции не будут понятны в php3.ini.

    В PHP 4 значением по умолчанию для error_reporting будет E_ALL &

    E_NOTICE , что означает отображение всех ошибок и предупреждений, которые не имеют уровень E_NOTICE-level. В PHP 3 значение по умолчанию — E_ERROR | E_WARNING | E_PARSE означает то же самое.

    Заметьте, однако, что, поскольку константы не поддерживаются в PHP 3 в файле php3.ini, установка error_reporting должна выполняться цифрами; то есть 7 по умолчанию.

    Настройка при помощи php.ini

    Параметр error_reporting позволяет устанавливать несколько уровней, используя побитовые флаги. К примеру, уровень:

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

    А для того чтобы показывать только ошибки (исключая предупреждения и замечания), директива должна быть настроена так, как показано ниже:

    Настройка при помощи .htaccess

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

    Настройка при помощи PHP

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

    Как правильно организовать обработку ошибок на PHP?

    Ошибки в лог надо писать все

    Вот простой быдлокодинг логирования ошибок. В лог попадает абсолютно всё, даже «засобаченное».

    Самому туда посылать ошибки можно функцией trigger_error()

    ‘; > else < // log error // file, database, whatever >> set_error_handler(‘errhandler’, error_reporting()); set_exception_handler(‘exceptionHandler’);

    >> Если ошибка идет в лог, то можно и не знать о ее существовании
    Таким людям логи не нужны вообще.

    >>Получается, что нужно периодически просматривать лог-файл?
    Сделайте уведомления себе на почту.

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

    21 ошибка программиста PHP

    micha5 (Tale quale | 7827 )
    26.4.2009, 14:41

    Эта серия статей
    предназначена для
    тех программистов
    на языке PHP,
    которые хотят
    избежать наиболее
    общих ошибок в
    написании кода.
    Читатель, как
    минимум, должен
    знать общий
    синтаксис PHP, а
    также весьма
    желателен некоторый
    опыт использования
    языка на практике.
    ©
    Скачать.jar-(64.86kb)
    ©
    Скачать.txt-(41.6kb)
    ©
    Цитировать

    21 ошибка программиста PHP

    micha5 (Tale quale | 7827 )
    26.4.2009, 14:41

    Эта серия статей
    предназначена для
    тех программистов
    на языке PHP,
    которые хотят
    избежать наиболее
    общих ошибок в
    написании кода.
    Читатель, как
    минимум, должен
    знать общий
    синтаксис PHP, а
    также весьма
    желателен некоторый
    опыт использования
    языка на практике.
    ©
    Скачать.jar-(64.86kb)
    ©
    Скачать.txt-(41.6kb)
    ©
    Цитировать

    21 ошибка программиста php, часть 3

    Название 21 ошибка программиста php, часть 3
    страница 1/11
    Дата конвертации 26.04.2013
    Размер 65.87 Kb.
    Тип Тексты

    21 ошибка программиста PHP, часть 3

    Описания семи, последних, «смертельных» ошибок. Эти ошибки концептуальны по своей природе и являются причиной появления ошибок, описанных в 1-ой и 2-ой частях статьи. Они включают и такие ошибки, как недостаточное внимание, уделённое как проекту в целом, так и коду программы, в частности

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

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

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

    Часть третья

    7 «смертельных» ошибок


    • href=»4.php#Audience»>Целевая аудитория
    • href=»4.php#Intro»>Введение

  • href=»4.php#7″>7.
    Программирование методом «вырезать-вставить»: неверный подход
  • href=»4.php#6″>6.
    Отсутствие в проекте технических директив
  • href=»4.php#5″>5.
    Отсутствие экспертной оценки программы
  • href=»4.php#4″>4.
    «Латание» проекта
  • href=»4.php#3″>3.
    Исключение конечного пользователя из процесса разработки

  • href=»4.php#2″>2.
    Отсутствие плана
  • href=»4.php#1″>1.
    Сорванные сроки
  • href=»4.php#summ»>резюме

  • href=»2.php»>21
    ошибка программиста PHP, часть 1
  • href=»3.php»>21
    ошибка программиста PHP, часть 2

  • name=audience>

    Целевая аудитория


    Введение

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

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

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

    Часть 1: Описываются 7 «детских» ошибок (#21-15, в обратном порядке, в соответствии со степенью серьёзности по нашей классификации). Такие ошибки не вызывают серьёзных проблем, но приводят к уменьшению эффективности работы программы, а также выражаются в громоздком трудночитаемом коде, в который, к тому же, трудно вносить изменения.

    Часть 2: Следующие 7 ошибок (#14-8) относятся к «серьёзным». Они ведут к ещё более значительному уменьшению скорости выполнения кода, уменьшению безопасности скриптов; код становится еще более запутанным.

    Часть 3: Описания семи, последних, «смертельных» ошибок. Эти ошибки концептуальны по своей природе и являются причиной появления ошибок, описанных в 1-ой и 2-ой частях статьи. Они включают и такие ошибки, как недостаточное внимание, уделённое как проекту в целом, так и коду программы, в частности.

    7. Программирование методом «вырезать-вставить»: неверный подход

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

    И если при всех оптимальных условиях код и будет работать, то при настоящей проверке обязательно свалится. Причём латание «дыр» никогда не сделает ваш код:


    • расширяемым: программа будет выглядеть как набор обрывков кода сляпанных вместе. Попросите опытного программиста что-либо изменить в таком скрипте, и он почти наверняка предпочтёт написать свой. Нечитаемый код — нерасширяемый код.
    • безопасным: вы вставляете в свой проект код чужого человека; при этом вы точно не знаете, что же именно код делает. Задумайтесь над этим. А что если код содержи подложный системный вызов, который сносит все файлы с вашего жёсткого диска? Кроме того, один и тот же код не может быть одинаково защищён и безопасен для разных систем. Ну и, наконец, вы просто копируете чужие ошибки.
    • быстрым: если вы собираете код из кусочков разных скриптов, не ждите от него быстрой работы. Ибо в этом случае логическое развитие скрипта попросту отсутствует; а всем известно, что в основе быстродействия скрипта лежит его логика.

    21 ошибка программиста PHP

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

    21 ошибка программиста PHP
    Автор: Стерлинг Хьюз
    Целевая аудитория
    Эта серия статей предназначена для тех программистов на языке PHP, которые хотят избежать наиболее общих ошибок в написании кода. Читатель, как минимум, должен знать общий синтаксис PHP, а также весьма желателен некоторый опыт использования языка на практике.
    Введение
    Одна из наиболее сильных сторон PHP является, одновременно, и его слабой стороной: PHP очень прост в изучении. Это привлекает многих людей; однако, несмотря на его кажущуюся простоту, не так-то просто научиться использовать этот язык правильно и эффективно.
    Как правило, дело в недостаточной практике программирования. Неопытные программисты становятся перед лицом необходимости создания сложных веб-приложений. Поэтому сплошь и рядом допускаются ошибки, которых избежал бы опытный программист, такие как необоснованное использование функции printf() или неправильное использование семантики PHP.
    В этой серии из трех статей представлены наиболее, по нашему мнению, характерные ошибки. Эти ошибки можно классифицировать по нескольким категориям, от «некритических» до «смертельных». Наряду с анализом этих ошибок представлены способы их избежания, а также некоторые «маленькие хитрости», накопленные за многие годы практики программирования.
    Часть 1: Описываются 7 «детских» ошибок (21-15 в обратном порядке, в соответствии со степенью серьезности по нашей классификации). Такие ошибки не вызывают серьезных проблем, но приводят к уменьшению эффективности работы программы, а также выражаются в громоздком трудночитаемом коде, в который, к тому же, трудно вносить изменения.
    Часть 2: Следующие 7 ошибок (14-8) относятся к «серьезным». Они ведут к еще более значительному уменьшению скорости выполнения кода, уменьшению безопасности скриптов; код становится еще более запутанным.
    Часть 3: Описания семи последних, «смертельных» ошибок. Эти ошибки концептуальны по своей природе и являются причиной появления ошибок, описанных в 1-ой и 2-ой частях статьи. Они включают и такие ошибки, как недостаточное внимание, уделенное как проекту в целом, так и коду программы, в частности.
    21. Неоправданное использование функции printf()
    Функция printf() предназначена для вывода форматированных данных.
    Например, ее следует использовать при необходимости вывода переменной в формате с плавающей запятой с определенной точностью, либо в любом другом случае, когда возникает необходимость изменения формата выводимых данных.
    Ниже приведен пример обоснованного применения функции printf(). В данном случае она используется для форматированного вывода числа «пи»:

    «Warning: Supplied argument is not a valid File-Handle resource in tst.php on line 4»

    <
    // Напечатаем каждое значение возраста

    Для чего здесь использована временная переменная?! Она просто не нужна:

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

    Используйте стандартные функций языка!
    Иногда так трудно устоять! Ведь программист редко знает сразу весь набор функций — у него обычно нет времени запомнить их все. Почему бы просто не переименовать функцию? Но, повторимся, этого не следует делать в силу изложенных выше причин.
    Хорошо бы иметь под рукой справочник по функциям PHP (удобно использовать индексированную версию в формате PDF). И перед тем как написать какую-либо функцию, внимательно посмотреть — не существует ли она уже в списке стандартных функций.
    Но следует заметить, что в кодах программ можно встретить пользовательские функции, написанные еще до их введения в качестве стандартных (например, функции сравнения двух массивов). Это не означает, что вы обязательно должны переписать код и заменять их стандартными функциями.
    16. Клиентская часть программы не отделяется от серверной части
    Многие программисты рекомендуют объединять код HTML (интерпретируемый на стороне клиента) и код PHP (выполняемый сервером) в один большой файл.
    Для маленьких сайтов это, возможно, неплохо. Но, когда ваш сайт начнет расти, вы можете столкнуться с проблемами при необходимости добавить какие-либо новые функции. Такой стиль программирования приводит к очень «непослушному» и громоздкому коду.
    API функций
    Если вы собрались отделить код PHP от HTML кода, у вас есть два варианта. Один способ — — создать функции динамического формирования вывода и поместить их в нужное место на веб-странице.
    Например, так:
    index.php — код страницы

    site.lib — Сам код программы

    function print_body ()
    <
    global $site_info;
    print nl2br ($site_info->body);
    >

    function print_links ()
    <
    global $site_info;

    $links = explode («\n», $site_info->links);
    $names = explode («\n», $site_info->link_names);

    for ($i = 0; $i $names[$i]

    Очевидно, такой код лучше читаем. Еще одно преимущество использования этой концепции — возможность изменения дизайна без модификации самого кода программы.
    Плюсы использования API функций
    • Относительно чистый, ясный код
    • Быстрый код
    Минусы использования API функций
    • Не настолько наглядно как система шаблонов
    • Все-таки для модификации дизайна требуется некоторое знание PHP
    Система шаблонов
    Второй способ, используемый для разделения PHP и HTML кода, — использование шаблонов. В данном случае некоторые элементы дизайна заменяются пользовательскими тегами, а сама программа сканирует файл на предмет их наличия и заменяет их необходимой информацией.
    Пример использования шаблонов:

    Затем пишем программу, просматривающую код шаблона и при выводе заменяющую тэги вида %%SOME%% нужной информацией.
    Примечание: неплохой класс для использования его в системе шаблонов — FastTemplate, его можно скачать с http://www.thewebmasters.net/.

    Опубликовал Kest Октябрь 26 2008 15:46:29 · 1 Комментариев · 58000 Прочтений ·

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

    Страница 1 из 4 1 2 3 4 >
    Комментарии
    Михаил Ноябрь 24 2010 16:20:09
    По-моему статья не закончена.
    Добавить комментарий
    Рейтинги

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

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

    Отлично! 50% [1 Голос]
    Очень хорошо 0% [Нет голосов]
    Хорошо 50% [1 Голос]
    Удовлетворительно 0% [Нет голосов]
    Плохо 0% [Нет голосов]
    Гость

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

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

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