Каковы специфические для PHP антипаттерны, о которых вы знаете?
PHP как инструмент Blunt
Я слышал, что в последнее время PHP часто сталкивается с проблемой. В целом ряде проектов я видел безумные базы php-кода - так плохо, что вы действительно задаетесь вопросом, был ли человек на галлюциногенных препаратах, когда они написали код. Иногда мне интересно, какой код был бы, если бы у начальных разработчиков было немного больше указаний относительно того, что не делать.
Тем не менее, я также видел некоторые очень хорошо организованные проекты PHP, которые были выполнены в 100% ООП, и мне было приятно поддерживать их, но они не были написаны "программистами PHP".
Я даю всем нашим младшим разработчикам ссылку на Java Anti-Patterns. Одна из приятных особенностей этой страницы - примеры, специфичные для Java, потому что есть много особенностей Java, которые поддаются общим ошибкам. Я надеялся найти аналогичный список для php, но поиск в Google не показал ничего значимого.
Есть несколько вопросов, которые уже существуют для того, что разработчик должен знать при программировании PHP, но я хотел сосредоточиться на негативе.
Каковы общие вещи, которые вы видели на PHP, которых следует избегать, и что является общим решением для того, чтобы сделать то же самое лучше?
Некоторые из очевидных примеров для меня, о которых я думаю, будут упомянуты, но не являются специфичными для PHP:
- Не объединяйте SQL. Используйте инструкции подготовки или правильное экранирование.
- Не слепо внедрять PHP в HTML - используйте templating/MVC.
- Не слепо отправлять исходный нефильтрованный ввод пользователя - счистите его для атак XSS.
- Не пытайтесь вручную анализировать все ваши POST и GET - используйте веб-фреймворк.
Вот некоторые примеры, которые я бы рассмотрел отдельно от PHP:
- Не нужно, чтобы слишком много слоев файла включали/требовали ссылки и пытались избежать условной привязки. Скорее, иметь разумное соглашение об именах и быть совместимым с вашей организацией.
- Не используйте PHP API исходных баз данных, если вы не можете помочь, вместо этого используйте инфраструктуру базы данных, например ADODB.
- Не злоупотребляйте динамической типизацией PHP, устанавливая переменную в строку в одном месте и логически где-то в другом месте, а затем ожидая, что логические тесты будут иметь смысл.
Итак, каков ваш любимый PHP-проект и как вы это делаете?
Ответы
Ответ 1
Я не согласен с этим:
- Не слепо внедрять PHP в HTML - используйте templating/MVC.
PHP - это язык шаблонов. Хотя я согласен с концепцией внедрения MVC, я не понимаю, почему должно быть требование реализовать еще один DSL для создания веб-выхода.
Ответ 2
Добавление закрывающих тегов "? > " в конец php файлов может привести к случайному нажатию белых пробелов в выходной буфер. PHP-интерпретатор автоматически добавит закрывающие теги к файлам, а делать это вручную - это несколько анти-шаблон.
Ответ 3
Моя текущая проблема с домашним животным непоследовательна - возвращаемый тип для функций запроса. Это когда вы вызываете функцию для выполнения запроса и возвращает
- NULL или FALSE или что-то подобное, когда совпадение не найдено.
- Соответствующий объект/значение, когда найдено одно совпадение
- массив совпадающих объектов/значений, когда найдено более одного соответствия
который заставляет вас проверять типы возврата и конкретно обрабатывать каждый случай. Было бы намного проще просто вернуть массив с 0, 1 или n элементами.
Ответ 4
- Никогда не используйте
$_GET
или $_POST
без проверки и очистки.
- Узнайте, как правильно настроить
php.ini
.
- Никогда не помещайте переменные в исходный SQL.
- Если вы используете фреймворки, используйте те, у которых меньше зависимостей.
- Остановить чрезмерное обобщение.
- Распределите код в файлах php. В большинстве случаев нет необходимости вносить все в один
index.php
.
- Уменьшите сложность перед написанием кода.
- Уважайте, что это веб-приложение. (Попробуйте RESTful.) Это не настольное приложение. Поэтому не ставьте все на
$_SESSION
.
- Как минимум одна строка комментариев для каждых 10 строк кода. Вы прочитаете это через год. Я обещаю!
- Код как девушка - приятно читать.
Ответ 5
Один из моих любимых DON'Ts должен быть:
$query = 'select * from users where username = ' . $_POST['username'];
Может ли быть намного страшнее, чем это?
Ответ 6
Если бы мне пришлось включить фаворита, это не должно быть сообщение, отправленное karim79:
$query = 'select * from users where username = ' . $_POST['username'];
Многие разработчики PHP остаются в структурированном возрасте. PHP поддерживает классы и объекты за последнее время, я просто не понимаю, почему люди хранят жесткое кодирование PHP в html, без шаблонов или вообще ничего.
Я считаю, что разработчики с других языков, например .NET или Java, заслужили право критиковать язык, если так много разработчиков продолжают программировать. PHP - очень отличный язык, очень гибкий, все еще немного младший, но растет, но многие просто не получают его, все, что им нужно, - это решить старую классическую копию и вставить.
Ответ 7
- использовать SPL
- используйте PDO вместо использования mysql_query или pg_query или других.
- всегда используйте расширение фильтра при вводе пользователя