- •Оглавление
- •Начало
- •Использование стабильной версии (5.5)
- •Встроенный веб-сервер
- •Установка на Mac
- •Установка в Windows
- •Vagrant
- •Стандарты написания кода
- •Основные моменты языка
- •Парадигмы программирования
- •Пространства имен
- •Стандартная Библиотека PHP (SPL)
- •Интерфейс командной строки
- •XDebug
- •Менеджер зависимостей
- •Composer и Packagist
- •PEAR
- •Практики написания кода
- •Основы
- •Дата и время
- •Design Patterns
- •Исключения
- •Уровни абстракции
- •Безопасность
- •Безопасность веб-приложений
- •Хэширование паролей
- •Фильтрация данных
- •Конфигурационные файлы
- •Использование глобальных переменных
- •Сообщения об ошибках
- •Тестирование
- •Тесто-ориентированная разработка
- •Поведенческо-ориентированная разработка
- •Дополнительные инструменты тестирования
- •Сервера и развертывание
- •Платформа, как сервис (PaaS)
- •Виртуальный или выделенный сервер
- •Виртуальный хостинг
- •Кэширование
- •Кэширование байткода
- •Кэширование объектов
- •Ресурсы
- •Из источника
- •Их следует читать в твиттере
- •Наставничество
- •PHP PaaS поставщики
- •Фреймворки
- •Компоненты
- •Сообщество
- •Пользовательские группы PHP
- •Конференции PHP
- •Советы по повышению эффективности PHP
- •Профилируйте ваш код для обнаружения узких мест
- •Обновите ваш PHP
- •Кэширование
- •Использование буферизации вывода
- •Не копируйте переменные без причины
- •Избегайте SQL запросов в цикле
- •Дополнительные руководства
- •Основы
- •Операторы сравнения
- •Условные операторы
- •Глобальное пространство имён
- •Строки
- •Тернарный оператор
- •Объявление переменных
- •Функциональное программирование в PHP
- •Шаблоны проектирования
- •Фабрика (англ. Factory)
- •Одиночка (англ. Singleton)
- •Фронт-контролер (англ. Front Controller)
- •Модель-представление-контроллер (англ. Model-View-Controller)
Основы
Операторы сравнения
Операторы сравнения часто упускается из виду аспект PHP, который может привести ко многим неожиданным результатам. Одна из таких проблем возникает из-за строгого сравнения (сравнение логических значений в виде целых чисел).
1<?php
2 |
$a = 5; // 5 |
как |
целое число (integer) |
|
3 |
|
|
|
|
4 |
var_dump($a == |
5); |
// Сравниваются |
значения; Вернёт true |
5var_dump($a == '5'); // Сравниваются значения (игнорируя типы); Вернёт true
6 var_dump($a === 5); // Сравниваются типы и значения (integer vs. integer); В\
7ернёт true
8 var_dump($a === '5'); // Сравниваются типы и значения (integer vs. string); Ве\
9 рнёт false
10
11/**
12* Строгое сравнение
13*/
14if (strpos('testing', 'test')) { // 'test' находится в 0 позиции, результатом \
15будет 'false'
16// Ваш код...
17}
18 |
|
|
|
19 |
vs. |
|
|
20 |
|
|
|
21 |
if (strpos('testing', 'test') !== false) { |
// Результатом будет 'true', т.к. т\ |
|
22 |
ут строгое сравнение (0 !== false) |
|
|
23 |
// Ваш код... |
|
|
24 |
} |
|
|
|
• |
Операторы сравнения¹ ² |
|
|
• |
Таблица сравнения типов¹ ³ |
|
¹ ²http://php.net/manual/ru/language.operators.comparison.php ¹ ³http://php.net/manual/ru/types.comparisons.php
Основы |
46 |
Условные операторы
Оператор “If”
При использовании операторов ‘if/else’ внутри функции или класса, существует распространенное заблуждение, что ‘else’ должен быть использован при возврате результатов выполнения. Если условие не выполняется и при этом возвращается значение (return $value), то использование ‘else’ может быть спорным.
1<?php
2function test($a)
3{
4if ($a) {
5 return true;
6} else {
7return false;
8 |
} |
9 |
} |
10 |
|
11 |
vs. |
12 |
|
13function test($a)
14{
15if ($a) {
16return true;
17}
18return false; // else использовать не обязательно
19}
•Оператор “If”¹
Оператор “Switch”
Оператор “Switch” является отличным способом, чтобы не использовать много операторов “if” с использованием “elseif”, но необходимо знать некоторые вещи:
•Оператор “Switch” сравнивает только значения, но не типы данных (равнозначно логической операции ‘==’)
•Этот оператор сравнивает выражение с каждым значением, пока не найдёт нужное. Если не нашёл, использует “default” (если определён)
¹http://php.net/manual/ru/control-structures.if.php
Основы |
47 |
•Без использования ‘break’, выражение будет сравниваться со всеми значениями попорядку, пока не встретит “break” или “return”
•Если вы используете для возврата результата ‘return’ то ‘break’ можно опустить.
1<?php
2 |
$answer = test(2); |
// Этот код выберет 'case 2' и 'case 3'. |
3 |
|
|
4function test($a)
5{
6switch ($a) {
7case 1:
8 |
// Код... |
|
9 |
break; |
// Прекратит выполнение switch тут если $a == 1, т\ |
10.к. используется 'break'
11case 2:
12 |
// Код... |
// Код без 'break', поэтому будет выполнено сравнен\ |
13ие с 'case 3'
14case 3:
15 |
// Код... |
|
16 |
return $result; |
// within a function, 'return' will end the functi\ |
17on
18default:
19 |
// Код... |
20 |
return $error; |
21}
22}
•Оператор Switch¹
•PHP switch¹
Глобальное пространство имён
Когда вы используете пространство имён (namespaces), вы можете обнаружить, что некоторые функции вам скрыты, недоступны. Что исправить это, указываете что это глобальная функция, использовав обратную косую черту ‘/’ перед именем функции.
¹http://php.net/manual/ru/control-structures.switch.php ¹http://phpswitch.com/
Основы |
48 |
1<?php
2 namespace phptherightway;
3
4function fopen()
5{
6$file = \fopen(); // Функция имеет имя такое же как и глобальная функция '\
7fopen'.
8 |
// Чтобы их различать используйте в глобальных '\'. |
9 |
} |
10 |
|
11function array()
12{
13 |
$iterator = new \ArrayIterator(); // ArrayIterator внешний класс. Если испо\ |
14 |
льзовать его без '/' |
15 |
// то интерпретатор PHP будет пытаться на\ |
16йти его в пространстве 'phptherightway'.
17}
•Глобальное пространство имён¹
•Правила именования¹
Строки
Конкатенация (сцепление)
•Если ваша строка на одной строке занимает не рекомендуемую длину (120 символов), используйте конкатенацию.
•Для удобства чтения лучше использовать конкатенацию, чем операторы присваивания.
•Если используете новую строку при сцеплении строк, делайте относительно оригинальной строки отступы.
¹http://php.net/manual/ru/language.namespaces.global.php ¹http://php.net/manual/ru/userlandnaming.rules.php
Основы |
49 |
1<?php
2 |
$a = 'Multi-line example'; |
// Оператор сцепления строк (.=) |
3$a .= "\n";
4 |
$a .= 'of what not to do'; |
|
5 |
|
|
6 |
vs. |
|
7 |
|
|
8 |
$a = 'Multi-line example' |
// Оператор объединения (.) |
9 |
. "\n" |
// используя новые строки. |
10. 'of what to do';
•Операторы для строк¹
Тип строки.
Строки постоянный спутник для сообщества PHP, надеемся, эта статья объяснит различия между строковыми типами и их преимущества/использование.
Одиночные кавычки
Часто самый быстрый способ отделить строку - эта использовать одинарные кавычки. Скорость заключается в том, что PHP не анализирует строку (не ищет в ней переменные). Одинарные кавычки лучше всего подходят для:
•строк, которые не нужно анализировать,
•имён переменных, которые нужно написать как текст.
1<?php
2 |
echo 'Посмотрите как прекрасна моя симпатичная строка.'; |
// анализ этой строке\ |
3 |
не нужен. |
|
4 |
|
|
5/**
6* Выведет:
7*
8 * Посмотрите как прекрасна моя симпотичная строка.
9*/
• Одиночные ковычки²
¹http://php.net/manual/ru/language.operators.string.php ²http://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.single
Основы |
50 |
Двойные кавычки
Двойные кавычки, как швейцарский нож. Они лучше всего используются для:
•Escaped strings
•строк с использованием переменных,
•использования Condensing multi-line concatenation, для удобство просмотра кода.
1<?php
2 |
echo 'phptherightway is ' . $adjective . '.' |
// эта строка использует multipl\ |
3 |
e concatenating для |
|
4 |
. "\n" |
// отделения переменных от строк\ |
5и.
6 . 'I love learning' . $code . '!';
7
8 vs.
9
10echo "phptherightway is $adjective.\n I love learning $code!" // А тут использую\
11тся двойные кавычки.
При использовании двойных кавычки часто бывает, что переменную нужно использовать в чуть изменнёном виде. Но при анализе строки PHP не сможет определить что это переменная. Для решения этой проблемы, оберните переменную в фигурные скобки.
1<?php
2$juice = 'plum';
3 |
echo "I drank some juice made of $juices"; |
// $juices не определена |
4 |
|
|
5 |
vs. |
|
6 |
|
|
7$juice = 'plum';
8 |
echo "I drank some juice made of {$juice}s"; |
// $juice будет анализирована. |
9 |
|
|
10/**
11* Комплексные переменные также оборачивайте в фигурные скобки.
12*/
13
14 $juice = array('apple', 'orange', 'plum');
15 echo "I drank some juice made of {$juice[1]}s"; // $juice[1] будет анализирован\
16 а.
• Двойные кавычки² ¹
² ¹http://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.double
Основы |
51 |
Nowdoc синтаксис
Nowdoc синтаксис был введён в php 5.3 и используется также как и одинарные кавычки, только для использования нескольких строк не нужно использовать объединение.
1<?php
2 |
$str = <<<'EOD' |
// Инициализируется <<< |
3Example of string
4 spanning multiple lines
5 using nowdoc syntax.
6$a does not parse.
7 |
EOD; |
// закрывается 'EOD' (должен быть на новой строке и б\ |
8 |
ез отступов). |
|
9 |
|
|
10/**
11* Вывод:
12*
13* Example of string
14* spanning multiple lines
15* using nowdoc syntax.
16* $a does not parse.
17*/
•Nowdoc² ²
Heredoc синтаксис
Heredoc синтаксис работает также как и двойные кавычки, но также для использования нескольких строк не нужно использовать объединение.
1<?php
2 |
$a = |
'Variables'; |
|
3 |
|
|
|
4 |
$str |
= <<<EOD |
// Инициализируется <<< |
5Example of string
6 spanning multiple lines
7 using heredoc syntax.
8$a are parsed.
9 |
EOD; |
// закрывается 'EOD' (должен быть на новой строке и \ |
10 |
без отступов). |
|
11 |
|
|
² ²http://www.php.net/manual/ru/language.types.string.php#language.types.string.syntax.nowdoc