Статьи

Хороший и плохой PHP-код

Следующее переиздано из Tech Times # 165 .

Когда я беру интервью у кандидата на должность разработчика PHP в SitePoint, я почти всегда задаю один вопрос, потому что его ответ так много говорит мне о том, какой он программист. Вот вопрос: «Как вы думаете, в чем разница между хорошим PHP-кодом и плохим PHP-кодом?»

Мне нравится этот вопрос, потому что он проверяет не только энциклопедические знания кандидата о функциях PHP. PHP-сертификация Zend хорошо справляется с этой задачей (как, впрочем, и тест, который Yahoo! выдает кандидатам на работу для PHP-разработчиков )

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

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

Хороший код PHP должен быть структурирован . Длинные порции кода можно разбить на функции или методы, которые выполняют подзадачи с помощью простого кода, в то время как неочевидные фрагменты должны быть прокомментированы, чтобы сделать их смысл понятным. Насколько это возможно, вы должны отделить внешний интерфейс HTML / CSS / JavaScript-код от серверной логики ваших приложений. Функции объектно-ориентированного программирования в PHP предоставляют вам особенно мощные инструменты для разбиения ваших приложений на разумные блоки.

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

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

Хороший код PHP должен быть безопасным . Хотя PHP предлагает отличную производительность и гибкость из коробки, он оставляет важные вопросы, такие как безопасность, полностью в руках разработчика. Глубокое понимание потенциальных дыр в безопасности, таких как межсайтовый скриптинг (XSS), подделка межсайтовых запросов (CSRF), уязвимости внедрения кода и лазейки в кодировке символов, сегодня очень важно для профессионального разработчика PHP.

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

Многие из вопросов в этом экзамене кажутся простыми на поверхности, но они дают кандидатам много возможностей показать, насколько они заботятся о маленьких деталях.

Следующий «плохой» код — очень упрощенный пример того, что мы могли бы поставить на экзамене PHP для разработчиков. Вопрос может быть что-то вроде «Как бы вы переписали этот код, чтобы сделать его лучше?»

<? echo("<p>Search results for query: " . $_GET['query'] . ".</p>"); ?> 

Основная проблема в этом коде заключается в том, что пользовательское значение ( $_GET['query'] ) выводится непосредственно на страницу, что приводит к уязвимости межсайтового скриптинга (XSS). Но есть много других способов, которыми это может быть улучшено.

Итак, на какой ответ мы надеемся?

Хорошо:

 <? echo("<p>Search results for query: " . htmlspecialchars($_GET['query']) . ".</p>"); ?> 

Это наименьшее, чего мы ожидаем. Уязвимость XSS была исправлена ​​с помощью htmlspecialchars чтобы избежать опасных символов в переданном значении.

Лучше:

 <?php if (isset($_GET['query'])) { echo '<p>Search results for query: ', htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>'; } ?> 

Теперь это похоже на кого-то, кого мы могли бы нанять:

  • «Короткий» открывающий тег PHP ( <? ) Был заменен более переносимой (и дружественной к XML) формой <?php .
  • Прежде чем пытаться вывести значение $_GET['query'] , isset используется для проверки того, что оно действительно имеет значение.
  • Ненужные скобки ( () ) вокруг значения, переданного echo , были удалены.
  • Строки разделяются одинарными кавычками вместо двойных кавычек, чтобы избежать снижения производительности при поиске переменных PHP для интерполяции внутри строк.
  • Вместо того, чтобы использовать оператор конкатенации строк ( . ) Для передачи одной строки в оператор echo , строки, которые должны выводиться с помощью echo , разделяются запятыми для небольшого повышения производительности.
  • Передача аргумента htmlspecialchars для гарантии того, что одинарные кавычки ( ' ) также экранированы, не является строго обязательной в этом случае, но это хорошая привычка.

Несколько досадно, что число разработчиков PHP, которые ищут работу, способную дать вполне удовлетворительный ответ на этот вопрос — по крайней мере, здесь, в Мельбурне, — мало и далеко друг от друга. Мы потратили три месяца на собеседование на эту последнюю должность, прежде чем нашли кого-то, с кем мы были счастливы!

Итак, как бы вы поступили, когда задали такой вопрос? Есть ли какие-то факторы, которые делают PHP-код хорошим или плохим, который, по вашему мнению, я не учел? А что еще вы бы искали в PHP-разработчике?