расставляй правильно приоритеты и не отвлекайся на мелочи

Хороший стиль программирования

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

Когда пишите PHP программу, придерживайтесь следующих советов:

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

2. Как можно меньше используйте Echo, пользуйтесь по необходимости буферизированным выводом
Хороший код:

<?
for ($i = 0, $max = sizeof($arr), $str = «»; $i < $max; $i++) $str .= $arr[$i];
echo $str;
?>

Быстрый код:

<?
ob_start();
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr[$i];
?>

3. Всегда пользуйтесь операторами Incremental/Decremental

$i++;
$i—;
++$i;
—$i;

4. Всегда пользуйтесь комбинированными операторами

$i += 10;
$i *= 10;
$i /= 10;
$str .= «»;

5. Разберитесь с оператором сравнения — ‘идентичность’ и используйте его.

===

6. Пользуйтесь «улучшенными» проверенными конструкциями:

Цикл по «обычному» массиву

$arr = array(«first», «second»);
for ($i = 0, $max = sizeof($arr); $i < $max; $i++) echo $arr;

Цикл по «ассоциативному» массиву

$arr = array(«first» => «value1» , «second» => «value2»);
while (list(, $val) = each($arr)) echo $val;

если нужен ключ:

while (list($key, $val) = each($arr)) echo $key.»=».$val;

Чтение результата запроса из БД в массив

$arr = array();
while ($row = @mysql_fetch_assoc($resquery)) $arr[] = $row;

Формирование из массива списка IN в SQL запросе

$arr = array(1, 2);
$query = sprintf(«SELECT * FROM `table` WHERE `id` IN (‘%s’)»,
implode(«‘, ‘», $arr));
/*
В итоге получится строка:
SELECT * FROM `table` WHERE `id` IN (‘1’, ‘2’)
*/

7. Пользуйтесь «правильной» конструкцией для формирования строки SQL запроса

$query = sprintf(«SELECT * FROM `table` WHERE `id` = ‘%d’ AND `name` = ‘%s'»,
$val1,
mysql_real_escape_string($val2));

Замечание: используйте символы « в именах полей, баз, таблиц и т.д., чтобы не иметь проблем с именованием

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

9. Старайтесь по максимуму, не смешивать PHP код и HTML код

10. Прочитайте про проект PEAR и научитесь грамотному именованию переменных, функций и т.д.

11. Не изобретайте велосипед, пользуйтесь готовыми решениями
К примеру о некоторых я уже писал здесь и много интересного Вы найдете в PEAR и sourceforge.net.

12. Поверьте, можно замечательно прожить без объектно-ориентированного программирования, всегда подумайте над целесообразностью его использования в своей задаче.

13. И напоследок самое главное: ВСЕГДА проверяйте, что принимаете и что отсылаете
Имеются ввиду типы переменных, их размерность, наличие/отсутствие обратных слэшей в строках, HTML сущности (entities), URL encoding и т.п., помните, PHP за Вас это никогда не сделает.

Дополните список, пришлите мне комментарии.

19 марта 2007, дополнено, переписан пункт 2

14. Всегда используйте относительные пути
Один из примерных методов:

файл index.php (любой файл запуска скрипта):
<?
include(«config.php»);

?>

файл config.php:
<?
define(«BASEDIR», dirname(__FILE__));
require(BASEDIR . «/lib/libs.php»);

?>

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

4 апреля 2007, дополнено

15. Разберитесь с тернарным оператором и используйте его.


return($err !== 0 ? false : true);

9 комментариев на статью:
  1. Sam:

    2 — спорно. Создатиели Zend Engine рекомендуют не использовать сокращённые тэги.

    3 и 4 — тоже спорно. Программа может стать нечитаемой.

    6 — вообще странная рекомендация. Неужели foreach хуже?

    11 — плохой совет для новичков.

    12 — опять же плохой совет для новичков. Особенно, если учесть PHP5.2.

  2. dennis:

    2 sam:
    По поводу 2, 3, 4, 12 я специально оговаривался о целесообразности и необходимости. Всегда должен действовать принцип необходимой достаточности, особенно при разговоре об необходимости ООП. Кстати, эта любимая тема спора с друзьями.

    6 — не хотел обидеть foreach :-), раньше сам его использовал, затем понял, зачем еще одну конструкцию держать в уме, если все это while делает, который я чаще использую

    11 — не понял, что плохого в откатанных решениях.
    Знаете какая у меня самая популярная «запарка» у новичков: Как мне через PHP отправить почтовое сообщение с вложением? Беседовать с такими можно долго, но итоговое решение всегда одно — phpMailer, только время жалко. Примеров масса…

  3. dennis:

    2 sam:
    Забыл сказать: спасибо за советы

  4. Yuriy:

    Паттерны программирования в хороший стиль программирования уже не входят?

  5. dennis:

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

  6. Yuriy:

    http://www.phppatterns.com/
    Думаю 11 пункт подразумевает использование сторонних библиотек.

  7. Good notes about php development « Esh notes:

    […] Good notes about php development By eshnotes http://handynotes.ru/2007/03/blog-post_16.html […]

  8. TrinitroN:

    Слушайте, кто писал эту статью? Не хочу показаться свиньей, и обсир*ть все что написано, но во многих пунктах я с автором просто несогласен (как минимум в пяти)! Пожалуйста, если вы действительно считаете что ваши умозаключения верны, то сопровождайте их конкретными фактами, а не пустыми словами! Например, пункт первый:(плюсы и минусы)
    + помогает при работе с заголовками.
    — увеличивает нагрузку на сервер. (требуется подключение)
    — … и т.д.
    Ну и все За и Против ее использования, а не просто: ИСПОЛЬЗОВАТЬ ВСЕГДА! бред какой-то….

    • admin:

      Это сборка советов собранных с просторов интернета и многократно применяемых различными людьми.
      Насчет Вашего например по первому пункту ничего не понял: как инициализация переменных помогает при работе с заголовками и что за подключение требуется?
      Насчет ВСЕГДА: читайте второй комментарий (ключевое слово — целесообразность)

Ответить
Обязательные поля помечены *