05.12.2010

30+ Лучших советов для начинающих PHP программистов

Представляю Вашему вниманию вольный перевод статьи 30+ PHP Best Practices for Beginners

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

1. Подружитесь с руководством по PHP

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

2. Включите вывод ошибок

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

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

3. Попробуйте использовать IDE

IDE (Integrated Development Environments - интегрированная среда разработки) полезный инструмент для любого разработчика. Хотя IDE подходит не для всех, безусловно займет свое место. IDE предоставляет такие возможности как:

  • подсветка синтаксиса
  • дополнение кода
  • предупреждения об ошибках
  • рефакторинг (переработку) кода

И многое другое.

IDE

4. Попробуйте использовать PHP-фреймворк

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

Опровержение: Лично я не рекомендовал бы начинающим использовать фреймворки. Изучите основы в первую очередь :)">

5. Принцип DRY

DRY обозначает Don’t Repeat Yourself (Не повторяйся), и является важным подходом в программировании не зависимо от языка. Метод DRY, как ясно из названия, подразумевает что вы не пишите лишнего кода. Например

$mysql = mysql_connect('localhost', 'reinhold', 'secret_hash');  
mysql_select_db('wordpress') or die("cannot select DB"); 

тоже самое, основываясь на принципе DRY:

$db_host = 'localhost';
$db_user = 'reinhold';
$db_password = 'secret_hash';
$db_database = 'wordpress';

$mysql = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_database); 

Вы можете более подробно почитать о принципе DRY здесь и здесь.

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

Если вы не используете отступы и пробелы в коде, результат выглядит как искусство Jackson Pollack (американский художник, идеолог и лидер абстрактного экспрессионизма, оказавший значительное влияние на искусство второй половины XX века). Убедитесь, что ваш код читаемый и в нем легко найти нужный кусок кода, потому что скорей всего вам придется его дорабатывать в будущем. IDE и продвинутые текстовые редакторы могут добавлять отступы автоматически.

7. Делайте код "ступенчатым"

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

8. Всегда используйте <?php ?>

Зачастую программисты пытаются использовать сокращенную форму объявления PHP скриптов. Вот несколько примеров:

<?
    echo "Hello world";
?>

<?="Hello world"; ?>

<% echo "Hello world"; %>

Хотя это и сокращает запись на несколько символов, все эти методы остаются для совместимости и неофициальны. Придерживайтесь стандартного <?php ?> это будет гарантировать поддержку во всех будущих версиях.

9. Используйте осмысленные имена, в соответствии соглашением об именовании

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

10. Комментарии, Комментарии, Комментарии

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

11. Установите MAMP/WAMP

MySQL это самый популярный сервер баз данных, используемый с PHP (если не единственный). Если вы хотите организовать локальную среду разработки для тестирования своих PHP приложение, присмотритесь к MAMP (Mac) или WAMP (Windows). Установка MySQL на ваш компьютер может оказаться довольно утомительным процессом, а оба этих пакета уже содержат MySQL. Чисто и просто.

MAMP/WAMP

12. Ограничивайте свои скрипты

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

13. Используйте объекты (или ООП)

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

14. Различайте двойные и одиночные кавычки

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

Замечание: На самом деле это не совсем так. Тесты показывают, что если строка не содержит переменных, то двойные кавычки дают выигрыш в производительности.

15. Не выкладывайте phpinfo() в вашей корневой директории сервера

Phpinfo(выводит информацию об интерпретаторе PHP) это замечательная штука. Создайте простой PHP файл с таким содержанием

<?php phpinfo(); ?>

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

phpinfo

16. Никогда не доверяйте пользователям

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

17. Храните пароли в зашифрованном виде

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

echo md5('myPassword'); // выведет - deb1536f480475f7d593219aa1afd74c

Замечание: Имейте ввиду, что MD5 хеши уже научились взламывать. Они добавляют безопасности, однако атакующий может расшифровать хэш с помощью "радужных таблиц". Для повышения безопасности добавляйте "соль" (salt). "Соль" добавляет дополнительные символы к пользовательской строке.

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

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

использование визуальных средств для отображения базы данных

19. Используйте буферизованный вывод

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

Для включения буферизации вывода просто добавьте ob_start() в начале файла.

Замечание: Считается хорошим тоном добавлять функцию ob_end_flush(); в конец документа. P.S. Хотите сжать HTML? Просто замените ob_start(); на ob_start('ob_gzhandler');

За дополнительной информацией обратитесь сюда

<!DOCTYPE html>

<?php ob_start('ob_gzhandler'); ?>
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>untitled</title>
</head>
<body>

</body>
</html>
<?php ob_end_flush(); ?>

20. Защищайте скрипты от SQL-инъекций

Если вы не используете экранирование символов в сроках с SQL-запросами, то ваше приложение подвержено SQL-инъекциям. Вы можете избежать этого используя mysql_real_escape_string, или подготовленные (заранее компилированные) запросы.

Пример использования mysql_real_escape_string:

$username = mysql_real_escape_string( $GET['username'] );

и подготовленной строки:

$id = $_GET['id'];
$statement = $connection->prepare( "SELECT * FROM tbl_members WHERE id = ?" );
$statement->bind_param( "i", $id );
$statement->execute();

Используя подготовленные конструкции мы предотвращаем прямую запись пользовательских данных в запрос. Вместо этого мы используем, метод "bind_param" для связывания значений с переменными в запросе. Более безопасно, быстрее, особенно при выполнении нескольких операторов CRUD (create read update delete — "Создание чтение обновление удаление" - прим.) за раз.

Более подробно можно прочитать в статье создание безопасных PHP приложение

21. Используйте ORM

Если вы пишите объектно-ориентированный код в PHP, можете использовать объектно-реляционное отображение (ORM). ORM позволяет преобразовывать данные между реляционной базой данных и объектно-ориентированным языком программирования. Если коротко: ORM позволяет работать с базой данных так же как и с классами и объектами в PHP.

Одна из многих ORM-библиотек для PHP Propel, а так же ORM присутствует в PHP-фрейворках, например в CakePHP.

22. Кэшируйте страницы, использующие базу данных

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

// начало скрипта
$cachefile = 'cache/'.basename($_SERVER['SCRIPT_URI']);
$cachetime = 120 * 60; // 2 часа
// используем кэш, если значение меньше $cachetime
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
include($cachefile);
echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->";
exit;
}
ob_start(); // начало буферизованного вывода
// ваш скрипт и HTML должен быть здесь
// конец скрипта
$fp = fopen($cachefile, 'w'); // открываем файл кэша для записи
fwrite($fp, ob_get_contents()); // сохраняем содержимое буферизованного вывода в файл
fclose($fp); // закрываем файл
ob_end_flush(); // отправляем данные браузеру

Эта часть кода использует кэшированную версию страницы, если страница не "старше" 2х часов.

23. Используйте системы кэширования

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

используйте систему кэширования

24. Проверяйте куки (Cookie)

Данные куки (Cookies - прим.), как и любые данные передаваемые через Интернет могут навредить. Проверить данные куки можно с помощью htmlspecialchars() или mysql_real_escape_string().

25. Используйте кэширование файлов

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

26. Профилируйте свой код

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

27. Стандарты кодирования

После того как вы освоитесь в PHP, можно переходить к изучению стандартов кодирования. Существуют различия между стандартами (Zend , Pear), выберите свой и придерживайтесь ему всегда.

28. Держите функции вне циклов

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

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

29. Не плодите переменные

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

Плохой

$description = strip_tags($_POST['description']);
	echo $description;

Хороший

echo strip_tags($_POST['description']);

Замечание: Говоря на счет удвоения расхода памяти, на самом деле заблуждение. PHP реализует управление памятью на основе подхода "копирование при записи". Это означает, что вы можете присвоить одно значение нескольким переменным и не беспокоится, что данные будут дублироваться в памяти. Можно поспорить, что "хороший" пример удачный пример хорошего кода, однако он точно не быстрее.

30. Обновляйтесь до последней версии PHP

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

31. Уменьшайте количество запросов в базе данных

Чем меньше запросов к базе данных тем больше производительность PHP-скрипта. Такие утилиты как Stace (Unix) и Process Explorer (Windows) позволят найти избыточные процессы и устранить их.

уменьшайте количество запросов к БД

32. Не бойтесь спрашивать

Только люди пытаются скрыть факт своего не знания в определенной области. Никто не хочет показаться глупым! Но как мы можем учиться не спрашивая? Чувствуйте себя свободнее используя форумы и IRC StackOverflow, спрашивайте у бывалых PHP разработчиков. На сайте PHP есть страница поддержки.