23 дек. 2015 г.

Распространенные ошибки при разработке, недочеты в коде и рекомендации

Распространенные ошибки при разработке, недочеты в коде и
рекомендации.
1. Двойные кавычки. Старайтесь использовать их только когда это необходимо, ибо
http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.double
2. вместо​
  ​
if (is_array($var) && isset($var[‘abcde’]) && $var[‘abcde’])
{...}  ​
достаточно написать ​
if (!empty($var[‘abcde’])) {...} ​
  ​
, даже если
переменная ​
$var ​
  не объявлена, или она пришла не в виде массива, или в массиве ​
$var
отстутствует ключ ​
‘abcde’ ​
.
3. вместо ​
array_push($array, $value);  ​
достаточно написать ​
$array[] = $value;
4. вместо ​
if ($a > 0) {...}  ​
можно написать ​
if ($a) {...}  ​
, хотя в случае если $a
меньше нуля это не прокатит. Однако в разработке под друпал мы редко работаем с отрицательными числами.
5. вместо ​
if (count($array)) {...}  ​
достаточно написать ​
if ($array) {...}
6. вместо ​
if ($x) {$a = ‘yes’;} else {$a = ‘no’;} ​
  ​
целесообразнее написать ​
$ ​
a =
$x ? ‘yes’ : ‘no’;
7. вместо ​
$a == ‘yes’ ? $b = 1 : $b = 0; ​
 пишем ​
$b = $a == ‘yes’ ? 1 : 0;
8. вместо ​
$a = $b > 10 ? TRUE : FALSE; ​
  пишем ​
$a = $b > 10;
9. многие пишут​
  ​
if (isset($var)) {unset($var);} ​
. Это неправильно. Unset не
нуждается в такой проверке.
10. бывает и так: ​
unset($var); $var = array(); ​
.
11. C/C++ программисты, опустившиеся до PHP. Отбрасываем привычки навроде приведения
типов (int)$var, (string)$str без нужды при каждом пуке (было такое, было). Изучите ​
“Loose
comparisons with ==” ​
, ​
“Strict comparisons with ===” ​
 и ​
“Comparisons of $x with PHP functions”   ​
(гугл в
помощь).
12. Не используем алиасы функций вместо актуальных (например,  ​
sizeof() = count(),
chop() = rtrim() ​
)
13. Помните, что вызов функции ​
t(‘text’)  ​
влечет за собой сохранение в базе переводов
значения ‘text’, если оно там отсутствует, или перевода на русский этого текста, если он
есть. Поэтому использование динамических строк типа ​
t(‘count is ’ . $value)
недопустимо. Вам придется наблюдать в управлении переводами кучу неперевёденных
строк ​
‘count is 1’, ‘count is 2’, ‘count is 3’, ‘count is 333’ ​
, и т.д. Вместо
этого пишем ​
t(‘count is @value’, array(‘@value’ => $value)); ​
. ​
  ​
Изучите
справку по ​
t()  ​
и ​
 format_plural() ​
.
14. Вместо ​
if (node_load(123) && $a) {...} ​
  ​
и т.п., следует писать ​
if ($a &&
node_load(123)) ​
. Сначала выполняем легкие проверки, а потом тяжелые, не тормозим
без нужды работу сайта, drupal и так тормозной!
15. некоторые после использования переменной могут в конце написать
unset($переменная) ​
, несмотря на то, что далее к ней не будет обращения. Это не очень
нужно.
16. switch/case ​
  ​
стейтмент не пихаем везде и всюду. Используем разумно.
17. @  ​
­ зло.
18. Белый экран иногда (обычно на сабмитах форм), ошибок в коде нет,  логи тоже пусты, “не
знаю что делать”. ­ скорее всего закрывающий тэг ​
?> ​
 с переносом или пробелом после,
либо PHP­файл в UTF8 с BOM. Кто­то нарушил пункт No0 :) Ищите в последних
модифицированных  или добавленных файлах.
19. Какие­то внезапные трудно отлавливаемые ошибки в js или стили едут ­ скорее всего
что­то связанное с UTF8 или кириллицей в скриптах. Либо использование для последнего
елемента js­массива запятой. Болезненно для ИЕ.
20. Проблема ­ сайт внезапно стал тормозить. Причины могуть быть разные, но одна из самых
неявных ­ вы по каким­то причинам решили удалить включенный модуль физически, но не
отключили его в админке. Ядро в таком случае каждый раз, видя в БД включенный модуль
(поле  ​
status=1  ​
в таблице  ​
system ​
) ​
 и не находя его тело, начинает искать по всем папкам. При
этом, независимо от результатов поиска система его сама не отключает.
21. Если переменная ​
$var ​
  ​
существует, но равна ​
NULL ​
, то ​
isset($var) ​
  ​
вернет ​
FALSE ​
.
22. Вместо ​
array_key_exists() ​
  ​
проще использовать ​
isset() ​
. Исключение ­ определение
наличия в массиве ключа даже со значением NULL(см выше), тут ​
isset()  ​
не сработает.
23. foreach (db_query(‘нехитрый SQL­запрос’) as $result) {...}  ​
­ это не
страшно.
24. запросы (даже нехитрые) в теле foreach/for ­ вот что страшно.
25. Вместо ​
strlen() ​
  ​
используем аналог ­​
  ​
drupal_strlen() ​
! То­же самое касается
substr(), strtolower(), strtoupper() ​
. См. справку. Исключение ­ гарантированно не содержащие UTF8 строки.
26. Имена таблиц в SQL­запросах оборачиваем в ​
{плейсхолдеры} ​
.  ​
Так­же ​
не ​
используем т.н.
грависы (`такие` `вот` `кавычки`)
27. Запросы генерим по обстоятельствам, где­то используем объект ​
db_select() ​
, где­то
напрямую вызов​
  ​
db_query() ​
, как проще.
28. При сохранении таймштампа в БД используем константу ​
REQUEST_TIME
29. При выводе этого таймштампа юзеру, используем друпаловскую ​
format_date() ​
.
30. Прежде чем изобретать велосипед для игрищ с датами/временем не поленитесь заглянуть
в справку по PHP. Там для этого инструментов навалом. Плюс велосипеды в поставке
Друпала.
31. То­же самое касается строк и массивов.
32. В функции ​
my_module_install() ​
  ​
в установщике модуля, вместо ​
t(‘text’) ​
  ​
пишем ​
$t =
get_t(); $t(‘text’);
33. В хуке ​
hook_menu() ​
  ​
при указании заголовка пункта меню ​
(‘title’ => ‘Title’) ​
 не
используем ф­ю ​
t() ​
.
34. Создал новый пункт меню программно (​
hook_menu() ​
) ­ не работает. Нужно чистить кэш
Друпала.
35. Так­же ­ после добавлении каких­либо хуковых функций они не “подхватываются” ­ чистим
кэш Друпала.
36. Добавление всех подряд файлов модуля в директивы ​
files[] =  ​
...  .info­файла. Если вы
увидели такой подход в скачанном с друпал.орг модуле, то это не значит что так и надо
делать. Читаем внимательно ​
http://drupal.org/node/542202#files
37. Самое главное ­ никаких модификаций в файлах ядра или сторонних модуле