Распространенные ошибки при разработке, недочеты в коде и
рекомендации.
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. Самое главное никаких модификаций в файлах ядра или сторонних модуле
рекомендации.
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. Самое главное никаких модификаций в файлах ядра или сторонних модуле