Статьи

20 способов спасти котят и выучить PHP

Дважды в месяц мы пересматриваем некоторые из любимых постов наших читателей в истории Nettuts +. Этот учебник был впервые опубликован в январе 2011 года.

Есть старая пословица, датируемая 1700-ми годами, которая на английском языке гласит: « Котенок умирает каждый раз, когда программист PHP не следует передовым методам». Хорошо, не совсем; но просто пойти с этим!

Начало работы с PHP может быть непростым делом. Имея это в виду, эти 20 советов научат вас, как следовать лучшим практикам и спасать жизни … жизни котят.


Программирование часто и с целью сделает уроки, которые Вы изучаете, придерживаться.

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

Какую часть этого языка ты еще говоришь?

Если вы ответите « нет », я готов поспорить, что это связано с тем фактом, что вы на самом деле никогда не использовали язык — вы только изучали его. Но если вы все еще можете поддерживать разговор, скорее всего, потому, что вы действительно потратили некоторое время на разговоры на этом языке за пределами учебной среды. Возможно, вы провели год за границей или работали там, где был необходим второй язык?

Какова бы ни была причина, вы сохранили ее, потому что использовали ее в реальных ситуациях и помещали в личный контекст, который намного легче вспомнить позже.

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

Так что не волнуйтесь, что вы «недостаточно знаете», чтобы построить проект. Когда вы выбираете свой проект, у вас есть веская причина для исследования и реализации концепции. Программирование часто и с целью сделает уроки, которые Вы изучаете, придерживаться.


В каждом списке советов для начинающих есть этот совет, и на то есть веские причины.

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

Если вы посмотрите историю моего браузера на сайты, которые я чаще всего посещаю, руководство по PHP будет прямо вверху. Я не подозреваю, что это изменится, пока PHP остается моим языком программирования.

Поначалу руководство выглядит довольно устрашающе — его не очень удобно просматривать, а временами навигация может быть немного неудобной. Тем не менее, вы быстро освоитесь.

Возможно, лучшее, что нужно знать о руководстве по PHP, это то, что большинство функций можно найти с помощью шаблона http://php.net/ function-name в вашей адресной строке. Например, для поиска функции strpos() используйте http://php.net/strpos, а для array_key_exists() используйте http://php.net/array-key-exists. (ПРИМЕЧАНИЕ: обратите внимание на пропуск скобок и замену дефиса ( - ) на подчеркивание ( _ ) в адресе.)

Легко пропустить комментарии, но сделайте себе одолжение и просмотрите их. Если вы получаете неожиданный результат от функции, скорее всего, кто-то заметил это и объяснил в комментариях.

Вы также можете получить множество полезных советов и идей от сообщества разработчиков, прочитав комментарии.


В дополнение к руководству по PHP, в Интернете есть замечательные сообщества разработчиков. Некоторые из моих личных фаворитов включают StackOverflow.com и форум W3Schools.com .

Кроме того, Twitter — удивительно отличное место для размещения вопросов по PHP. Если вы пометите твит с помощью #PHP , вероятно, кто-то в сообществе заметит его и протянет руку.

Примечание о Твиттере: Конечно, все, что полезно, неизбежно будет переполнено спаммерами и теми жалкими людьми, которые глубоко неправильно поняли цель социальных сетей. Если вы собираетесь использовать Twitter в качестве сети поддержки, вы, вероятно, захотите регулярно блокировать или скрывать учетные записи, которые издают объявления о вакансиях, или ретвитить все, что упоминает PHP.

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


Когда вы учитесь, вы много услышите о «лучших практиках» в программировании; такие вещи, как готовые заявления и стандарты кодирования PEAR .

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

Если что-то и является хорошей практикой, то это не потому, что мы (имея в виду других разработчиков PHP) собрались вместе и сказали: «Как мы можем усложнить жизнь новичкам?»

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

Требуется примерно столько же обучения, чтобы понять mysql_query() как и для изучения PDO или MySQLi . Поэтому, если вы начнете с выбора двух последних, вы начнете с прочной основы взаимодействия с базой данных и, действительно, приложите меньше общих усилий.

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


Я просто хотел убедиться, что ты видел это.

Серьезно, ребята. Не используйте ярлыки. Каждый раз, когда вы нарушаете лучшие практики, потому что правильный путь кажется «слишком сложным», BP опускает котенка в сырую нефть.

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


Если вам нужно выжать символы из имен переменных, чтобы сократить время выполнения скрипта на 0,2 мс, вероятно, возникнет совсем другая проблема.

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

Каково бы ни было ваше искушение, сопротивляйтесь ему любой ценой.

Рассмотрим следующий фрагмент кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
 $a = b(‘[email protected]’);
 
 $c = explode(‘@’, $a);
 
 $d = $c[1];
 
 echo ‘The email address ‘, $a, ‘ belongs to the domain ‘, $d, ‘.’;
 
 function b($e) { return htmlentities($e, ENT_QUOTES);
 
?>

Это имеет какой-то смысл для вас?

Конечно, вы можете понять, что он делает, но зачем заставлять любого, кто пытается работать с вашим кодом, тратить лишние 1-5 минут, ломая голову, пытаясь вспомнить, что хранит $ c .

Итак, давайте возьмем этот код и сделаем его самодокументированным:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
 
 $email = sanitize_string(‘[email protected]’);
 
 $email_pieces = explode(‘@’, $email);
 
 $domain = $email_pieces[1];
 
 echo ‘The email address ‘, $email, ‘ belongs to the domain ‘, $domain, ‘.’;
 
 function sanitize_string($string) { return htmlentities($string, ENT_QUOTES);
 
?>

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

Конечно, вы сохраняете несколько байтов с короткими именами переменных. Но, если честно, если вам нужно выжать символы из имен переменных, чтобы сократить время выполнения вашего скрипта на 0,2 мс, вероятно, возникнет совсем другая проблема.


Комментарии являются признаком компетентного программиста.

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

Если ваш код самодокументируется, вам не потребуется слишком много комментариев. Тем не менее, независимо от того, насколько ясны имена переменных и функций, у вас всегда будут места, где предпринятые действия не так очевидны.

Когда это произойдет, добавьте комментарий. «Future You» даст «Present You» высокие пять, когда придет время обновить скрипт.

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

Учтите следующее:

1
2
$pieces = explode(‘.’, $image_name);
$extension = array_pop($pieces);

Что это делает? Вы должны были остановиться и подумать об этом? Вы до сих пор не знаете наверняка, что хранится в $ extension ?

Посмотрите на этот фрагмент еще раз, но с одним быстрым комментарием:

1
2
// Get the extension off the image filename
$pieces = explode(‘.’, $image_name);

Теперь, даже если вы не знаете, как или почему работает этот код, вы, по крайней мере, знаете, что $extension относится конкретно к расширению изображения. Если это сэкономит «Future You» или другому разработчику пять секунд на обработку намерений сценария, то стоит добавить свои десять секунд, прежде всего, чтобы добавить комментарий.

Как и в большинстве случаев, умеренность является ключевым фактором. Слишком мало комментариев, и вы рискуете оставить следующего разработчика (или Future You) озадаченным фрагментом кода, который может даже привести к случайному взлому кода, потому что решение без объяснения может показаться глупым или излишним. Слишком много, и становится слишком сложно сканировать ваш код, что также разочаровывает.

Модерация является ключевым.


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

У меня есть несколько причин для моей сильной поддержки Докблока:

  1. Требуется продумать, что и почему для каждого файла, функции, метода и т. Д.
  2. Он дает четкое описание ожидаемых типов для параметров и возвращаемых значений в функциях / методах
  3. Это обеспечивает быстрое описание того, что делает код
  4. В сочетании с одной из многих IDE, поддерживающих Docblock, он создает подсказку по коду (что позволяет увидеть описание и ожидаемые параметры / возвращаемые значения для метода или функции, которые вы используете)

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

Docblock лучше всего демонстрирует свою универсальность, когда используется для документирования класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * A simple class to get the sum or difference of $_foo and a value
 *
 * @author Jason Lengstorf <[email protected]>
 * @copyright 2011 Copter Labs
 * @license http://www.opensource.org/licenses/mit-license.html
*/
 
class CopterLabs_Test
{
 
 /**
  * The value to use in addition and subtraction
  * @var int
 */
 private $_foo = 0;
 
 /**
  * Adds a value to $_foo and returns the sum *
  * @param int $add_me The value to add to $_foo
  * @return int The sum of $_foo and $add_me
*/
public function add_to_foo( $add_me=0 )
{
  return $this->_foo += $add_me;
}
 
 /**
  * Subtracts a value from $_foo and returns the difference
  * @param int $subtract_me The value to subtract from $_foo
  * @return int The difference of $_foo and $subtract_me
*/
public function subtract_from_foo( $subtract_me=0 )
{
  return $this->_foo -= $subtract_me;
}
 
}

Поначалу это может показаться ошеломляющим, но преимущества стоит потратить время на то, чтобы ознакомиться с синтаксисом.

Приведенный выше Docblock при использовании в Netbeans создаст следующую подсказку кода:

Подсказка кода в Netbeans

Если вы еще не знаете тип, вы скоро узнаете: разработчики, которые думают, что настоящие программисты не используют IDE.

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

Не будь тем парнем.

Нет ничего плохого в использовании программного обеспечения для оперативной подсветки синтаксиса, проверки ошибок и подсказок кода.

Насколько глубоко работает ваша IDE, зависит только от вас. Лично мне очень нравятся Netbeans . Я слышал множество похвал за Coda для Mac (хотя на самом деле это не IDE), и раньше я использовал Eclipse, прежде чем перейти на Netbeans.

Независимо от того, какую IDE вы выберете, вы увидите, что ваша скорость кодирования увеличится, а количество ошибок, достойных лицевой стороны, уменьшится. Кроме того, по мере расширения вашей библиотеки кодов у вас будет подсказка кода для всех ваших пользовательских программ. (Потому что вы используете Докблок, верно? Верно ?!)

Не думайте, что IDE не круты — независимо от того, что «Парень» пытается вам сказать.


Если вы видите повторяющееся действие, самое время рассмотреть возможность перемещения этого кода в функцию.

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

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

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

Для примера рассмотрим следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
$unclean1 = ‘<a href=»javascript:alert(\’Holy Crap!\’);»>Click Me!</a>’;
 
$detagged1 = strip_tags($unclean1);
$deslashed1 = stripslashes($detagged1);
$clean1 = htmlentities($deslashed1, ENT_QUOTES, ‘UTF-8’);
 
$unclean2 = «Let’s call Björn!»;
 
$detagged2 = strip_tags($unclean2);
$deslashed2 = stripslashes($detagged2);
$clean2 = htmlentities($deslashed2, ENT_QUOTES, ‘UTF-8’);
 
echo $clean1, «<br />», $clean2;

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

Это тот случай, когда использование функции вместо этого гораздо более желательно:

01
02
03
04
05
06
07
08
09
10
11
12
13
$unclean1 = ‘<a href=»javascript:alert(\’Holy Crap!\’);»>Click Me!</a>’;
 
$clean1 = sanitize_input($unclean1);
$clean2 = sanitize_input($unclean2);
 
echo $clean1, «<br />», $clean2;
 
function sanitize_input( $input )
{
  $detagged = strip_tags($input);
  $deslashed = stripslashes($detagged);
  return htmlentities($deslashed, ENT_QUOTES, ‘UTF-8’);
}

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


Получение контроля над ООП — это еще одна из тех вещей, которые я описываю в разделе «Лучшие практики для обучения как можно быстрее».

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

Изучение объектно-ориентированного программирования определенно выходит за рамки этого списка, но я чувствовал, что это определенно стоит упомянуть в этом списке новичков.


PHP позволяет вам определять свои собственные константы с помощью функции define().

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

Я хранил такие вещи, как данные всего приложения (например, имя сайта или максимальная ширина изображения) и учетные данные базы данных в переменных, и я обнаружил, что должен использовать $GLOBALS для доступа к этой информации.

Затем я понял, что PHP позволяет вам определять свои собственные константы с помощью функции define() .

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

В качестве передовой практики, как правило, не рекомендуется использовать глобальные переменные, поэтому использование констант в любом случае предпочтительнее. Просмотрите следующий код для примера и убедитесь сами:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<?php
 
define(‘FOO’, ‘constant value’);
 
$bar = ‘global value’;
 
echo baz();
 
function baz()
{
   $constant = ‘ Constant: ‘ .
   $global = ‘Global: ‘ .
 
   return $constant .
}
 
?>

Часто, когда вы создаете большие продукты, имеет смысл разбить их на более мелкие куски или включить файлы.

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

Например, на сайте с несколькими страницами может появиться стандартный шаблон, который выглядит примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?php
 
// Application-wide data and database connection
require_once ‘constants.inc.php’;
require_once ‘database.inc.php’;
 
// Utility functions
require_once ‘utilities.inc.php’;
 
// Header markup
require_once ‘header.inc.php’;
 
/* * Page-specific processing goes here */
 
// Footer markup
require_once ‘footer.inc.php’;
 
?>

Это точка почти паралича для некоторых разработчиков, и это действительно очень плохо; есть размытая грань между написанием эффективного кода и тратой времени на попытки выжать лишние 5 мсек из выполнения скрипта.

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

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

Никто не может определить разницу между загрузкой страницы 25 мс и загрузкой страницы 40 мс. Убедитесь, что это не 700 мс, и переходите к более важным вещам.


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

Учтите следующее:

1
echo ‘<div class=»example-div»><p>This is some test content.</p></div>’;

Было ли необходимо для этого кода обернуть тег абзаца в div? Мог ли он быть изменен, чтобы включить только тег абзаца, который содержит текст? Посмотрите на альтернативное решение:

1
2
3
<div class=»example-div»>
   <?php echo ‘<p>This is some test content.</p>’;
</div>

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

В большинстве случаев вы можете оставить HTML вне PHP, что облегчает чтение и, как правило, облегчает работу.


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

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

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

Посмотрите на проект, найдите все фрагменты, которые вы хорошо знаете (или, по крайней мере, достаточно хорошо), а затем выберите область, которую хотите понять. Подпишитесь на это. Затем сделать его.


Вы будете не правы. Часто. Но это не плохо.

По мере улучшения вы будете находить новые, лучшие решения проблем, с которыми вы сталкивались в прошлом. Не чувствуй себя глупо; ты учишься

Но очень важно, чтобы вы не привязывались к написанному вами коду. Не думай, что твой путь лучше только потому, что это твой путь. Если вы столкнетесь с отличным решением, которое заставит вас выглядеть как лейкопластырь на пулевом ранении, используйте его! Обратите внимание на то, что отличается и что вы сделали, что могло бы быть лучше. Храните это под «Вещи, которые я узнал».

Никогда не позволяйте себе верить, что неэквивалентное решение приемлемо, потому что оно ваше. Это гордыня (которая, если вы не в курсе, обычно не приводит к счастливым веселым временам).


Если вы веб-программист, начните знакомиться с проверкой ввода как можно скорее.

Имейте в виду: валидация совершенно отличается от санитарии .

Проверка правильности ввода — это проверка того, что данные соответствуют запрошенному формату, например проверка поля электронной почты на наличие действительного адреса электронной почты или проверка того, что введенное имя пользователя состоит из 8-20 буквенно-цифровых символов.

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


Если вы не в верхней части своего черного списка, появляются уязвимости.

Во многих ситуациях вы захотите заблокировать или избавиться от определенных тегов, слов, адресов электронной почты или других различных фрагментов данных.

Распространенным решением является использование blacklist : набор тегов, терминов и т. Д., Которые не допускаются.

Это создает проблему, однако; ты должен быть умнее человека, который пытается сделать что-то непослушное. Например, в случае отключения JavaScript в публикациях вы можете занести в черный список атрибут onclick , а также большинство атрибутов события, но что, если вы забудете один? Что если новый будет добавлен в спецификацию в будущем?

Если вы не в верхней части своего черного списка, появляются уязвимости.

Однако, чтобы сохранить головную боль позже, используйте whitelist всякий раз, когда это возможно. Белый список — это противоположность черного списка: набор разрешенных тегов, терминов и т. Д.

Например, в функции strip_tags() вы можете предоставить белый список, чтобы указать, какие теги разрешены в строках:

1
strip_tags($string, ‘<em><strong><tt>’);

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

Вы не можете избежать неприятностей в любой ситуации, но если вы скажете, что разрешено, а что нет, то вы получите больше уверенности и контроля над своими сценариями.


Вы ищете совет № 20? Помните, что почти во всех случаях счетчики в PHP начинаются с 0, так что это фактически 20-й совет. Вы найдете, что это имеет место в большинстве языков; не позволяй этому запутать тебя!


Если вы новичок, советы, описанные выше, помогут вам сделать большие шаги в направлении хороших привычек и лучших практик. Не расстраивайтесь, если все это новость для вас; делайте вещи по одному шагу за один раз (см. совет № 15).