Справочники, инструменты, документация

PHP: Онлайн учебник

PHP (англ. PHP: Hypertext Preprocessor) — скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов. Статья направлена на начинающих разработчиков с PHP.

Начало

Вывод текста на экран, оператор echo

Когда нужно отобразить текст на веб-странице, то оператор echo является наиболее употребляемым оператором в PHP. Как его иcпользовать - после слова echo нужно поместить строку текста в кавычки:

echo 'Привет от PHP'; 
// Отображение в браузере: Привет от PHP

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

echo 2016;

Оператор echo также может участвовать в форматировании веб-страницы:

echo 'Петров Иван<br>Родился<br>...';

Синтаксис HEREDOC

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

echo <<<END
<p>Для отображения большого <br> количества текста используют 
синтаксис heredoc</p> 
END;

Комментарии в скриптах

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

В PHP существует 3 типа комментариев.

Первый позволяет размещать комментарии в нескольких строках. Начинается такой тип комментариев с символов /* и заканчиваются */, например:

/* Тут может быть размещен любой текст, 
даже в несколько строк */

Следует иметь ввиду, что вложенные комментарии не допустимы. Такой код вызовет ошибку:

/* Тут может быть размещен любой текст, 
/*даже в */ 
несколько строк */

Следующие два типа являются однострочными. Такие комментарии начинаются с символов // или # и продолжаются до конца строки. Пример:

// Тут может быть размещен любой текст
# Только в одной строке !
echo "Привет Всем !";

Переменные

PHP создан не только для форматирования статичного текста. Для того, чтобы обрабатывать различные данные были придуманы переменные. Переменная - контейнер c данными. Каждая переменная содержит определенное значение.

Синтаксис переменной состоит из знака доллара - $ и свободного идентификатора которому присваивается какое-нибудь значение. Например:

$name = "Виктор";
Запомните, имя (идентификатор) переменной не может начинаться с цифр и пробела. Имя переменной чувствительно к регистру.

Создание переменной

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

$surname = "Петров"; 
$number = 1269794645; 
$pi = 3.14159265; 
$hello = "Hi all";

Переменную можно вывести на экран с помощью оператора echo, вот так:

$name = "Виктор"; 
echo "Ваше имя ", $name, "<br>"; 

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

$bann = 5; // Бананы 
$lim = 10; // Лимоны 
$together = $bann + $lim; // Всего 
echo "Количество фруктов ", $together;

Как вы видите, в третьей переменной мы сами ничего не складывали, за нас это сделал PHP.

Интерполяция переменных в PHP

Значение переменной может быть отображено например так:

$capital = "Paris"; 
echo "The capital of France is", $capital,"<br />";

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

$capital = "Paris"; 
echo "The capital of France is $capital <br />";

Отображение в браузере:

The capital of France is Paris

Также существует одна тонкость при использовании интерполяции переменных. Например:

$text = "news"; 
echo "Where's the $textpaper <br />"; 

Ожидается, что имя переменной $text будет заменено на ее значение. Но в результате будет выведено сообщение об ошибке. Чтобы этого не случалось нужно указать какую часть слова textpaper мы имеем введу за имя переменной. Для этого нужно взять ту часть которая нам нужна в фигурные скобки:

$text = "news"; 
echo "Where's the {$text}paper <br />";

Переменные, содержащие имена других переменных

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

$apples = 5;  // Создаем переменную $apples 
$fruit = "apples";  /* Создаем переменную $fruit, которая содержит имя переменной $apples */ 

// Сейчас мы можем вывести $apples, как $$fruit

echo "Число яблок - ", $$fruit;

Для корректного отображения подобных переменных в строковых константах, заключенных в двойные кавычки, следует также использовать фигурные скобки: ${$fruit}. Например:

echo "Число яблок - ${$fruit}";
// Число яблок - 5

Константы в PHP

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

define("pi", 3.14);

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

define("pi", 3.14); 

echo "Математическая константа Пи равняется ", pi;

Отображение в браузере:

Математическая константа Пи равняется 3.14

Попытка изменения константы приведет к неработоспособности скрипта! В качестве имени константы нельзя использовать зарезервированные слова в PHP, которые описанные ниже:

  • __LINE__ - номер текущей строки скрипта.
  • __FILE__ - полное имя файла текущего скрипта.
  • __FUNCTION__ - имя текущей исполняемой функции.
  • __CLASS__ - имя текущего класса.
  • __METHOD__ - имя текущего метода класса.
  • PHP_VERSION - версия PHP.
  • PHP_OS - операционная система под управлением которой работает PHP.
  • DEFAULT_INNCLUE_PATH - список путей, в которых PHP ищет подключаемые файлы.

Типы данных PHP

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

  • Boolean - это логический тип, который содержит значение true или false.
  • Integer - содержит значения целого числа (Например: 4 или 10 или другое целое число).
  • String - содержит значение текста произвольной длины (Например: Олег, Киев, Австрия).
  • Float - вещественное число (например: 1.2, 3.14, 8.5498777).
  • Object - объект.
  • Array - массив.
  • Resource - ресурс (например, файл).
  • NULL - значение NULL.
$bool = true;  // Значение Boolean
$int = 100;  // Значение Integer
$string = "Переменная содержит текст";  // Значение String
$string2 = "5425";  // Значение String, так как число взято в кавычки!
$float = 44.122;  // Значение Float

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

$str = "50000";  // Значение String
$new_str = (integer) $str;  // Теперь значение стало Integer

// Проверяем... 
echo $new_str + $new_str; 

Отображение в браузере:

100000

Операторы

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

Математические операторы и математические функции

Числовые данные обрабатываются при помощи таких операторов PHP:

  • + - сумма двух чисел.
  • - - разность чисел.
  • / - частное от деления двух чисел.
  • % - остаток от деления.
echo "2 + 2 = ", 2 + 2, "<br>"; 
echo "5 - 2 = ", 5 - 2, "<br>"; 
echo "10 * 10 = ", 10 * 10, "<br>"; 
echo "100 / 2 = ", 100 / 2, "<br>"; 
echo "10 % 2 = ", 10 % 2, "<br>";

Отображение в браузере

2 + 2 = 4 
5 - 2 = 3
10 * 10 = 100
100 / 2 = 50
10 % 2 = 0

PHP имеет огромное количество математических функций, вот их полный перечень:

  • Abs - модуль числа.
  • Sin - синус.
  • Sinh - гиперболический синус.
  • Cos - косинус
  • Cosh - гиперболический косинус.
  • Acos - арккосинус
  • Acosh - гиперболический арккосинус.
  • Asin - арксинус.
  • Asinh - гиперболический арксинус.
  • Atan2 - арктангенс частного двух переменных.
  • Tan - тангенс.
  • Tanh - гиперболический тангенс.
  • Atan - арктангенс.
  • Atan - гиперболический арктангенс.
  • Base_convert - преобразование числа в строковом представлении из одной системы cчисления в другую.
  • Decoct - преобразование числа в восьмеричное представление в виде строки.
  • Bindec - преобразование строки, предоставленной в двоичном числе, в целое значение.
  • Octdec - преобразование строки, представляющей восьмеричное число, в целое число.
  • Hexdec - преобразование строки, которая представляет шестнадцатеричное число, в целое число.
  • Ceil - округление числа в большую сторону.
  • Floor - округление числа в меньшую сторону.
  • Deg2rad - градусы в радианы.
  • Exp - вычисление экспоненты числа.
  • Fmod - остаток от деления двух чисел.
  • Getrandmax - максимальное значение, которое получают функцией rand().
  • Hypot - вычисление гипотенузы по двум катетам.
  • Is_finite - проверка, является ли число конечным вещественным числом.
  • Is_infinite - проверка, является ли число бесконечностью.
  • Is_nan - проверка, является ли значение Не числом(Not-A-Number).
  • Lcg_value - генератор случайных чисел.
  • Log10 - десятичный логарифм.
  • Log - натуральный логарифм.
  • Max - максимум заданных чисел.
  • Min - минимум заданных чисел.
  • Mt_getrandmax - Максимальное значение, которое можно получить функцией mt_rand.
  • Mt_rand - генератор псевдослучайных чисел по алгоритму.
  • Pi - значение числа π.
  • Pow - возведение в степень.
  • Round - округляет число типа float.
  • Sqrt - квадратный корень.
echo "round(4.2) = ", round(4.2), "<br>";
// round(4.2) = 4

Операторы присвоения в PHP

Основным оператором присвоения является знак равенства =. Он присваивает значение определенной переменной:

$fruits = 14;

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

$n = $m = $p = 3; 
echo $n, $m, $p;

Отображение в браузере:

333

Также в PHP есть комбинированные операторы, которые делают код более компактным:

  • +=
  • -=
  • /=
  • .=
  • %=
  • &=
  • |=
  • ^=
  • <=
  • >=

Например, если нужно прибавить 55 к значению переменной $number, это можно записать как:

$number = $number + 55;
$number += 55; если // использовать комбинированный оператор

Увеличение и уменьшение

Довольно часто в ходе написания PHP скрипта нужно или добавить к переменной единицу, либо отнять.

Для этого в PHP есть специальные операторы. Например, если есть переменна $a = 0, то чтобы добавить 1 к этой переменной нужно написать: $a++, это значит, что к переменной будет добавлена единица, если нужно отнять 1, то нужно записать так: $a--.

Оператор ++ называют инкрементом, а -- декрементом.

  • ++$a - Пре-инкремент. Увеличивает значение на единицу, затем возвращает значение.
  • $a++ - Пост-инкремент. Возвращает текущее значение, после чего увеличивает его на единицу.
  • --$a - Пре-декремент. Уменьшает значение на единицу, затем возвращает значение.
  • $a-- - Пост-декремент. Возвращает текущее значение, после чего уменьшает его на единицу.
$a = $b = $c = $d = 2; 

echo $a++, "<br>";
echo ++$b, "<br>";
echo $c--, "<br>";
echo --$d, "<br>";

Отображение в браузере:

2
3
2
1

Приоритет операторов PHP

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

Эта таблица показывает операторы по убыванию приоритета (операторы с одним приоритетом выполняются слева на право):

  • new
  • [
  • ! ~ ++ -- (int) (float) (string) (array) (object)
  • @
  • * / %
  • + - .
  • < >
  • < <= > >=
  • &
  • ^
  • |
  • &&
  • ||
  • ? :
  • = += -= *= /= .= %= &= |= ^= <= >=
  • print
  • and
  • xor
  • or
  • ,

Для изменения порядка выполнения операторов нужно использовать круглые скобки!

Оператор исполнения PHP

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

Любая строка, которая заключена в обратные апострофы — ` считаются как команда ОС. Например:

$d = \`dir d:\`;
echo $d;

Как результат вы получите список директорий диска D.

Строковые операторы PHP

PHP имеет два строковых оператора.

Первый - оператор конкатенации ., который объединяет две строки в одну.

Второй - конкатенирующий оператор присвоения .=, добавляет к строке нужное значение. Например:

$d = "Hello";
$f = $d." world";  // Теперь $f = "Hello world"

echo $f; 

echo "<br/>"; 

$f .= " ! ! !";  // Теперь $f = "Hello world ! ! !"

echo $f; 

Отображение в браузере:

Hello world
Hello world ! ! !

Условные операторы

Условный оператор IF в PHP

Во всех высокоуровневых языках программирования есть оператор if, в PHP синтаксис этого оператора такой:

if (exp) 
  statement
exp (выражение) 

exp (выражение) - логическое выражение, которое может быть истиной (TRUE) или ложью (FALSE), например, выражение 100 > 1 это истина (TRUE), statement (инструкция) выполняется тогда, когда exp — истина, и не выполняется когда exp ложь.

Например, если скорость машины будет больше 60 то это значит, что водитель превышает скорость:

$speed = 80;

if ($speed > 60)
  echo "Превышение скорости !";

Если нужно чтобы при выполнении условия выполнялись сразу несколько операторов, то нужно заключить их в фигурные скобки { и }:

$speed = 80;

if ($speed > 60) 
{  // Начало
 echo "Превышение скорости! <br>";
 echo "Пожалуйста, уменьшите скорость!";
}  // Конец

Отображение в браузере:

Превышение скорости!
Пожалуйста, уменьшите скорость!

Операторы сравнения PHP

При изучении условного оператора if мы использовали знак > в условии, так это и есть один из операторов сравнения в PHP! Все операторы сравнения которые есть в PHP указанные в таблице:

  • == - равенство - истина, если $a равно $b.
  • === - идентичность - истина, если $a равно $b, и они одного и того же типа.
  • != - неравенство - истина, если $a не равно $b.
  • <> - неравенство - истина, если $a не равно $b.
  • !== - неидентичность - истина, если $a не равно $b, или они не одного типа.
  • < - меньше - истина, если $a меньше $b.
  • > - больше - истина, если $a больше $b.
  • <= - меньше или равно - истина, если $a меньше или равно $b.
  • >= - больше или равно - истина, если $a больше или равно $b.

Стоит обратить внимание, что оператор сравнения записывается как ==, а не просто =.

$speed = 45;

if ($speed <= 60)
  echo "Скорость в пределах нормы";

Логические операторы PHP

Если нам нужно применить к выражению несколько условий, например: если больше 3 и меньше 6, то с помощью логических операторов мы можем это записать так:

$speed = 40;

if ($speed > 35 && $speed < 55) {
  echo "Скорость в пределах нормы";
}

Полный список логических операторов представленный в таблице:

  • and - логическое "И" - истина, если истинно $a и $b.
  • && - логическое "И" - истина, если истинно $a и $b.
  • or - логическое "ИЛИ" - истина, если истинно $a или $b.
  • || - логическое "ИЛИ" - истина, если истинно $a или $b.
  • xor - логическое "исключающее ИЛИ" - истина, если истинно $a или $b, но не оба одновременно.
  • ! - логическое "НЕ" - истина, если $a ложь.

Как вы видите, в таблице присутствуют два оператора "И" и "ИЛИ". Это потому, что оператор && или || имеет больший приоритет от "И" и "ИЛИ".

Оператор ELSE в PHP

Очень часто нужно при истинном значении выполнить одно действие, а при ложном другое. Для этого в PHP есть оператор else. Синтаксис оператора:

if(exp) 
  statement1
else 
  statement2

Пример:

$speed = 50;

if ($speed > 60)
  echo "Превышение скорости !";
else 
  echo "Скорость в пределах нормы"
// Выведит: Скорость в пределах нормы

Оператор ELSEIF в PHP

Оператор if имеет еще одно расширение, это оператор elseif, он используется для последовательной проверки условий. Синтаксис:

if (exp) 
  statement1
elseif (exp2) 
  statement2

Также можно записывать так:

if (exp) 
  statement1
else if (exp2) 
  statement2

Пример:

$speed = 50;

if ($speed < 30)
  echo "Скорость в пределах нормы";

elseif ($speed == 30)
  echo "Ваша скорость 30 км/час";

elseif ($speed == 40)
  echo "Ваша скорость 40 км/час";

elseif ($speed == 50)
  echo "Ваша скорость 50 км/час";

elseif ($speed == 60)
  echo "Ваша скорость 60 км/час";

else 
  echo "Превышение скорости!";

Также, такой кусок кода можно записать и так:

$speed = 50;

if ($speed < 30)
  echo "Скорость в пределах нормы";

elseif ($speed >= 30 && $speed <= 60)
  echo "Ваша скорость {$speed} км/час";

else 
  echo "Превышение скорости!";

В этом случае будет выведено сообщение Ваша скорость 50 км/час. А если бы не одно условие не подошло бы, то сработал бы оператор else и мы увидели Превышение скорости!.

Тернарный оператор PHP

Тернарный оператор работает почти также как и оператор if, но при использовании тернарного оператора, мы вместо ключевых слов пишем ? и :.

Синтаксис:

$var = condition ? exp1 : exp2;

Если условие выполняется, то переменной $var присваивается результат вычисления exp1, иначе exp2.

Пример:

$speed = 55;

echo ($speed <= 60) ? "Скорость в пределах нормы" : "Превышение скорости !"; 
// Выведит: Скорость в пределах нормы

Начиная с версии PHP 5.3 можно использовать тернарный оператор в таком варианте:

$var = $value ?: "Другое значение";

// эквивалентно
$var = $value ? $value : "Другое значение";

Этот вариант полезно использовать, когда нужно изменить значение переменной, только в случае, когда проверяемая переменная не равняется true.

Также, уже начиная с версии PHP 7.0 можно использовать тернарный оператор в таком варианте:

$var = $value ?? "Другое значение";

// эквивалентно
$var = isset($value) ? $value : "Другое значение";

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

Оператор SWITCH в PHP

Иногда даже использование конструкции операторов if ... elseif несколько утомляет. Чтобы исправить эту ситуацию есть оператор switch. Синтаксис:

switch (exp) 
{
  case condition1:
  exp1;
  break;

  case condition2:
  exp2;
  break;

  case condition3:
  exp3;
  break;

  default:
  exp4;
  break;
}

Сначала записывается ключевое слово switch, после которого в скобках записывается некоторое выражение.

Далее, после слова case нужно перечислить возможные варианты значений, если значение истина, то выполняется группа операторов, которые записаны до оператора break. Если ни одно условие не подходит, то выполняется оператор default (если оператор default не записывать, то при не выполнении никаких других условий ничего не произойдет).

$speed = 55;

switch($speed)
{
  case 30 : 
    echo "Ваша скорость 30 км/час";
  break;

  case 58 : 
    echo "Ваша скорость 50 км/час";
  break;

  case 70 : 
    echo "Превышение скорости !";
  break;

  default : 
    echo "Скорость в пределах нормы";
  break;

}

Также, при использовании оператора switch, мы можем записать несколько условий для некоторого действия:

$speed = 55;

switch($speed)
{
  case 30 : 
  case 58 : 
    echo "Скорость в пределах нормы";
  break;

  case 70 : 
    echo "Превышение скорости !";
  break;

  default : 
    echo "Скорость в пределах нормы";
  break;

}
// Выведит: Скорость в пределах нормы

Циклы

Цикл FOR в PHP

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

for (exp1; exp2; exp3) statement
  • exp1 — вставляют начальное значение для счетчика цикла — переменная, которая считает количество раз выполнения тела цикла.
  • exp2 — задает условие повторения цикла. Цикл будет выполнятся пока это условие будет true.
  • exp3 — выполняется каждый раз после выполенения тела цикла. Обычно, оно используется для изменения (увеличение или уменьшение) счетчика.

Пример:

for ($i = 0; $i < 10; $i++) 
{
  echo "Вывод строки. 10 раз <br>"; 
} 

Отображение в браузере:

Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз
Вывод строки. 10 раз

Циклы WHILE в PHP

Цикл WHILE, вместо использования счетчика цикла проверяет некоторое условие до того, пока это условие Истина (TRUE). Синтаксис:

while (exp) statement

Условие проверяется перед выполнением цикла, если оно будет Ложным в начале, то цикл не выполнится ни разу! В теле цикла должна быть переменная которая будет оказывать влияние на условие, чтобы предотвратить зацикливание. Пример:

$counter = 0; 
while ($counter < 5) 
{
  echo "Эта строка выведется 5 раз <br>"; 
  $counter++;
}

Отображение в браузере:

Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз

После вывода строки, переменная $counter увеличивается на 1, и когда она станет больше или равна 5, то цикл завершится.

Цикл DO... WHILE в PHP

Главное отличие цикла DO ... WHILE от WHILE в том, что первый сначала выполняется тело цикла, а потом проверяет условие - если условие сразу Ложь, то цикл выполнится один раз. Синтаксис:

do
  statement 
while (condition)

Использование цикла DO... WHILE:

$counter = 6; 

do
{
  echo "Эта строка выведется 1 раз <br>"; 
  $counter++;
}
while ($counter < 5);

Отображение в браузере:

Эта строка выведется 1 раз

Так как условие цикла сразу Ложь (6 > 5), то цикл выполнился всего один раз, так как сначала выполняется тело цикла, а потом проверяется условие цикла.

Цикл FOREACH в PHP

Цикл FOREACH представлен для упрощения работы с массивами (массивы будет рассмотрены дальше). Массивы состоят из отдельных элементов, цикл FOREACH предназначен для перебора этих элементов без счетчика. Синтаксис:

foreach (array as $value) statement 
foreach (array as $key => $value) statement

Использование цикла:

$array = array ("Apple", "Limon", "Chery", "Oranges"); 

foreach ($array as $value)
{
  echo "Вы выбрали фрукт - $value <br>"; 
}

Отображение в браузере:

Вы выбрали фрукт - Apple 
Вы выбрали фрукт - Limon 
Вы выбрали фрукт - Chery 
Вы выбрали фрукт - Oranges

Строки

Функции для обработки строк в PHP

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

Все функции для обработки строк перечислены ниже:

  • chr - возвращает символ по его коду ASCII.
  • chunk_split - разбивает строку на подстроки заданной длины.
  • crypt - зашифровывает строку с использованием одного из алгоритмов.
  • echo - выводит одну или несколько строк.
  • explode - разбивает строку на подстроки, ограниченные заданным разделителем, и форматирует из них массив.
  • html_entity_decode - декодирует все HTML-представления в соответствующие символы. Функция обратно по отношению к htmlentites.
  • htmlentites - кодирует все специальные символы в их HTML-представление.
  • htmlspecialchars - кодирует все символы в их HTML-представление.
  • implode - формирует строку из элементов массива.
  • ltrim - удаляет начальные пробелы из строки.
  • rtrim - удаляет конечные пробелы из строки.
  • number_format - представляет число в виде строки в различных форматах.
  • ord - возвращает ASCII-код символа.
  • parse_str - разбивает строку URL и присваивает значение переменным.
  • print - выводит строку.
  • printf - выводит строку с форматированием.
  • sprintf - возвращает строку с форматированием.
  • setlocale - устанавливает информацию о кодовой странице.
  • similar_text - вычисляет степень похожести двух строк.
  • sscanf - разбивает строку по шаблону и присваивает полученные значения переменным.
  • str_ireplace - то же самое, что и str_replace, но без учета различий в регистре символов.
  • str_pad - дополняет строку до заданной длины другой строкой.
  • str_repeat - повторяет строку заданное количество раз.
  • str_replace - ищет в строке все вхождения подстроки и меняет на заданную строку.
  • str_shuffle - случайным образом перемешивает все символы в строке.
  • str_split - формирует массив из символов строки.
  • str_word_count - подсчитывает количество слов в строке.
  • strcasecmp - выполняет побайтовое сравнение строк без учета регистра символов.
  • strcht - то же самое что strstr.
  • strcmp - выполняет побайтовое сравнение строк с учетом регистра символов.
  • strip_tags - удаляет из строки все HTML-и PHP-теги.
  • stripos - ищет первое вхождение подстроки в строке без учета регистра символов.
  • stristr - то же самое что strstr, но без учета регистра символов.
  • strlen - возвращает длину строки.
  • strnatcasecmp - то же самое что strnatcmp, но без учета регистра символов.
  • strncmp - выполняет побайтовое сравнение первых n символов строк.
  • strpos - ищет первое вхождение подстроки в строке.
  • strrchr - ищет последнее вхождение символа в строке.
  • strrev - инвертирует строку - прочитывает ее справа налево.
  • strripos - ищет последнее вхождение подстроки в строке без учета регистра символов.
  • strrpos - ищет последнее вхождение подстроки в строке.
  • strspn - возвращает длину участка строки, состоящего из заданных символов.
  • strstr - возвращает часть строки от первого вхождения подстроки до конца.
  • strtolower - преобразует прописные буквы в строчные.
  • strtoupper - преобразует строчные буквы в прописные.
  • strtr - преобразует заданные символы в строке.
  • substr_compare - сравнивает две строки, начиная с заданного смещения.
  • substr_count - подсчитывает, сколько раз заданная подстрока встречается в строке.
  • substr_replace - ищет в заданном участке строки все вхождения подстроки и меняет на другую строку.
  • substr - возвращает заданную часть исходной строки.
  • trim - удаляет начальные и конечные пробелы из строки.
  • ucfirst - преобразует первую букву строки в прописную.

Использование строковых функций в PHP

Как использовать несколько строковых функций для обработки текста.

Функция substr

Функция substr используется для получения части строки. Синтаксис:

string substr (string $string, int $start [, int $length ])

Первый параметр $string - строка из которой нужно получить подстроку начиная с позиции $start и длиной в $length. Пример:

echo substr("Hello world", 6, 5);
// Выведит: world

Последний параметр $length необязательный:

echo substr("Hello world!!!", 6);
// Выведит: world!!!

Если $start отрицательный, то возвращаемая подстрока будет иметь значение от конца строки до позиции $start с конца строки.

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

Функция strpos

Функция возвращает позицию первого вхождения подстроки в строку.

int strpos (string $string , mixed $needle [, int $offset = 0 ])

Первый параметр $string - строка в которой будет произведен поиск, $needle - строка, которую нужно найти, $offset - необязательный параметр, если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Пример:

echo strpos("Hello world", "world"); // получим 6

В результате, получим 6, так как строка world впервые встречается на 6 позиции

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

Массивы

Создание массивов в PHP

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

Массивы создаются при помощи оператора присвоения, также как и переменная.

Имена массивов начинаются со знака $, после которого следует произвольный идентификатор, далее идут квадратные скобки: $arr[0] = "php";.

Данная конструкция создает массив и присваивает его элементу с индексом 0 значение "php", после чего мы можем обращаться к этому элементу как к обычной переменной: echo $arr[0]. В результате мы увидим слово php.

Также, мы можем добавить еще элементы к массиву:

$arr[1] = "html";
$arr[2] = "css";

В качестве индекса элементов массива мы можем использовать не только числа:

$arr["Kiev"] = 3000000; 
$arr["Paris"] = 5000000; 
$arr["LA"] = 15000000;

В качестве значений индексов элементов и самих элементов мы можем использовать одинаковые типы данных одновременно!

Также существует сокращенная запись для индексирования:

$arr[] = 3000000; 
$arr[] = 5000000; 
$arr[] = 15000000;

В этом случае первый элемент (3000000) получит индекс 0! Нужно иметь это ввиду.

Для создания массива мы можем использовать функцию array:

$arr = array("php", "html", "css");

В этом случае первый элемент получит индекс 0.

Если нужно присвоить какой-то другой номер, то можно воспользоваться конструкцией =>:

$arr = array(1 => "php", "html", "css");

Теперь элемент под номером 1 это "php", а не "html"!

Также, можно создать массив со строковым индексом:

$arr = array("first" => "php", "second" => "html", "third" => "css");

Начиная с версии PHP 5.4, массивы можно создать через квадратные скобки:

$arr = ["php", "laravel", "yii", "zend", "cakephp"];

Модификация элементов массива в PHP

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

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

Для того, чтобы изменить значение элемента используем оператор присвоения:

$arr[1] = "JAVASCRIPT";

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

$arr[] = "JQUERY";

Для того, чтобы вывести на экран массив можно использовать foreach:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

$arr[1] = "JAVASCRIPT";
$arr[] = "JQUERY";

foreach($arr as $key => $value) { // при переборе: $key - индекс элемента массива, $value - значение элемента массива
  echo $value.'<br/>';
}

Отображение в браузере:

PHP
JAVASCRIPT
CSS 
JQUERY

Удаление элементов массива в PHP

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

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

unset($arr[1]);

foreach($arr as $key => $value) {
  echo $value.'<br/>';
}

Перебор элементов массива в PHP

Кроме использования цикла for для вывода всех элементов массива на экран мы можем использовать функцию print_r, которая выведет все элементы массива вместе с их индексами.

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

print_r($arr); 

Отображение в браузере:

Array ( [0] => PHP [1] => HTML [2] => CSS )

Также, чтобы результат вывода функции print_r был более наглядным рекомендую перед использованием функции писать echo "<pre>";, а после функции - echo "</pre>";.

Также в PHP присутствует специальный цикл для обработки массивов - цикл foreach.

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

foreach($arr as $value)
{ 
  echo $value, "<br>";
} 

Отображение в браузере:

PHP
HTML
CSS

Для вывода индекса элемента нужно использовать второй вариант синтаксиса цикла foreach:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

foreach($arr as $key => $value) { // $key - индекс элемента массива, $value - значение элемента массива
  echo "[{$key}] => {$value} <br/>";
}

Отображение в браузере:

[0] => PHP
[1] => HTML
[2] => CSS

Функции для работы с массивами в PHP

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

  • array_chunk - разбивает массив на несколько меньших массивов заданного размера.
  • array_combine - создает массив из двух заданных массивов - массива индексов элементов и массива значений.
  • array_count_values - формирует массив, индексами которого являются значения заданного массива, а значениями - число повторений соответствующего значения в заданном массиве.
  • array_diff - формирует массив из тех элементов первого заданного массива, которые отсутствуют в остальных заданных в качестве аргументов функции массива.
  • array_fill - заполняет массив заданным значением.
  • array_intersect - формирует массив из элементов, которые присутствуют во всех заданных массивах.
  • array_key_exists - проверяет наличие заданного индекса в массиве.
  • array_keys - возвращает массив из индексов заданного массива.
  • array_merge - объединяет несколько массивов в один.
  • array_multisort - выполняет сортировку многомерного массива или нескольких одномерных массивов.
  • array_pad - дополняет массив до заданного количества элементов заданным значением.
  • array_pop - возвращает последний элемент массива, одновременно удаляя элемент из массива.
  • array_push - добавляет заданные элементы в конец массива.
  • array_rand - выбирает один или несколько случайно взятых элементов из массива.
  • array_reduce - осуществляет последовательное применение заданной функции к элементам массива, формируя итоговое значение.
  • array_reverse - производит обращение массива - первый элемент становится последним, второй - предпоследним и т.д..
  • array_search - ищет заданный элемент в массиве и возвращает соответствующим ему индекс.
  • array_shift - возвращает первый элемент массива, одновременно удаляя его из массива с перенумерацией числовых индексов.
  • array_slice - вырезает из массива подмассив заданной длины, начиная с указанного элемента.
  • array_sum - вычисляет сумму всех элементов массива.
  • array_unique - удаляет дублирующиеся значения из массива.
  • array_unshift - добавляет один или несколько элементов в начало массива с перенумерацией числовых индексов.
  • array_walk - вызывает заданную функцию последовательно для каждого элемента массива.
  • array - создает массив из заданных значений или пар индекс - значение.
  • arsort - сортирует массив по убыванию его значений, сохраняя индексы неизменными.
  • asort - сортирует массив по возрастанию его значений, сохраняя индексы неизменными.
  • krsort - сортирует массив по убыванию его индексов.
  • ksort - сортирует массив по возрастанию его индексов.
  • sort - сортирует массив по возрастанию значений его элементов с перенумерацией его индексов.
  • usort - сортирует массив с использование заданной функции сравнения элементов массива.
  • rsort - сортирует массив по убыванию значений его элементов с перенумерацией его индексов.
  • natcasesort - сортирует массив естественным образом без учета регистра массива.
  • natsort - сортирует массив естественным образом с учетом регистра символов.
  • count - возвращает количество элементов в массиве.
  • current - возвращает значение текущего элемента массива.
  • each - возвращает текущие индекс и значение элемента массива и продвигает указатели на следующий элемент.
  • in_array - проверяет, присутствует ли заданное значение в массиве.
  • key - возвращает индекс текущего элемента массива.
  • list - присваивает значения из массива списку переменных.
  • pos - синоним функции current.
  • reset - устанавливает внутренний указатель на первый элемент массива.
  • shuffle - переставляет элементы массива случайным образом.
  • sizeof - синоним функции count.

Сортировка массивов в PHP

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

Первая функция - sort, которая сортирует массив по возрастанию значений его элементов, при этом изменяя индекс после сортировки:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

sort($arr); 

print_r($arr);

В нашем случае, массив отсортируется в алфавитном порядке. Отображение в браузере:

Array ( [0] => CSS [1] => HTML [2] => PHP )

Вторая функция - rsort, которая сортирует массив по убыванию значений его элементов, при этом не изменяя индекс после сортировки:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

rsort($arr); 

print_r($arr);

Отображение в браузере:

Array ( [0] => PHP [1] => HTML [2] => CSS )

Третья функция - ksort, которая сортирует массив по ключам, сохраняя отношения между ключами и значениями:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

ksort($arr); 

print_r($arr); 

Отображение в браузере:

Array ( [0] => PHP [1] => HTML [2] => CSS )

Следующая функция - krsort, которая сортирует массив по убыванию индексов его элементов:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

krsort($arr); 

print_r($arr); 

Отображение в браузере:

Array ( [2] => CSS [1] => HTML [0] => PHP )

Навигация по массивам в PHP

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

Для определения текущего элемента массива используют функцию current:

echo "Now is: ", current($arr), "<br>";

Для определения следующего элемента массива используют функцию next:

echo "Next is: ", next($arr), "<br>";

Для определения предыдущего элемента массива используют функцию prev:

echo "Previously is: ", prev($arr), "<br>";

Для определения последнего элемента массива используют функцию end:

echo "The end is: ", end($arr), "<br>";

Для определения первого (возврата указателя) элемента массива используют функцию reset:

echo "First is: ", reset($arr), "<br>";

Пример навигации по массивам:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

echo "Now is: ", current($arr), "<br>";
echo "Next is: ", next($arr), "<br>";
echo "Previously is: ", prev($arr), "<br>";
echo "The end is: ", end($arr), "<br>";
echo "First is: ", reset($arr), "<br>";

Отображение в браузере:

Now is: PHP
Next is: HTML
Previously is: PHP
The end is: CSS
First is: PHP

Преобразование строк в массивы и наоборот в PHP

PHP умеет преобразовывать данные из строки в массив и наоборот, для этого в PHP есть функция implode - формирует строку из массива, explode - формирует массив из строки.

Использование функции implode:

$arr[0] = "PHP"; 
$arr[1] = "HTML"; 
$arr[2] = "CSS";

$string = implode(", ", $arr);
echo $string; 
// Выведит: PHP, HTML, CSS

Использование функции explode:

$string = "PHP, HTML, CSS";
$arr = explode(", ", $string);
print_r($arr); 

Отображение в браузере:

Array ( [0] => PHP [1] => HTML [2] => CSS )

Извлечение переменных из массивов в PHP

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

$arr["one"] = "PHP"; 
$arr["two"] = "HTML"; 
$arr["three"] = "CSS";

extract($arr); 

echo "\$one = $one <br>";
echo "\$two = $two <br>";
echo "\$three = $three <br>"; 

Отображение в браузере:

$one = PHP
$two = HTML
$three = CSS

Если нужно сложить из переменных массив, то нужно использовать функцию compact.

$one = "PHP";
$two = "HTML";
$three = "CSS";

$arr = compact("one", "two", "three");

print_r($arr); 

Отображение в браузере:

Array ( [one] => PHP [two] => HTML [three] => CSS )

Слияние и разделение массивов в PHP

Если вам нужно добавить в массив несколько элементов другого массива, то вам поможет функция array_slice:

$arr["one"] = "PHP"; 
$arr["two"] = "HTML"; 
$arr["three"] = "CSS";

$new_arr = array_slice($arr, 0, 2); 
print_r($new_arr);

Отображение в браузере:

Array ( [one] => PHP [two] => HTML )

Первый параметр функции array_slice - это название того массива, с которого будут браться элементы; второй - начальный номер элемента (с какого элемента начинать брать элементы); третий - количество элементов выборки.

Для соединения массивов в один нужно использовать функцию array_merge:

$arr[1] = "PHP"; 
$arr[2] = "HTML"; 
$arr[3] = "CSS";

$arr2[1] = "PHOTOSHOP"; 
$arr2[2] = "PAINT.NET"; 
$arr2[3] = "DREAMWEAVER";

$new_arr = array_merge($arr, $arr2); 
print_r($new_arr); 

Отображение в браузере:

Array ( [0] => PHP [1] => HTML [2] => CSS [3] => PHOTOSHOP [4] => PAINT.NET [5] => DREAMWEAVER )

Сравнение массивов в PHP

Если нужно проверить какой элемент совпадает в том, или ином массиве, или наоборот НЕ совпадает, то можно использовать функцию array_diff:

$arr[1] = "PHP"; 
$arr[2] = "HTML"; 
$arr[3] = "CSS";

$arr2[1] = "PHP"; 
$arr2[2] = "PAINT.NET"; 
$arr2[3] = "DREAMWEAVER";

$diff = array_diff($arr, $arr2); 
print_r($diff);

Отображение в браузере:

Array ( [2] => HTML [3] => CSS )

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

$arr["one"] = "PHP"; 
$arr["two"] = "HTML"; 
$arr["three"] = "CSS";

$arr2[1] = "PHP"; 
$arr2["two"] = "HTML"; 
$arr2[3] = "DREAMWEAVER";

$diff = array_diff_assoc($arr, $arr2); 
print_r($diff); 

Отображение в браузере:

Array ( [one] => PHP [three] => CSS )

Если вам нужно найти общие элементы массивов, то вам поможет функция array_intersect:

$arr[1] = "PHP"; 
$arr[2] = "HTML"; 
$arr[3] = "CSS";

$arr2[1] = "PHP"; 
$arr2[2] = "PAINT.NET"; 
$arr2[3] = "DREAMWEAVER";

$diff = array_intersect($arr, $arr2); 
print_r($diff); 

Отображение в браузере:

Array ( [1] => PHP )

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

Обработка данных в массивах PHP

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

$arr[1] = 31; 
$arr[2] = 1; 
$arr[3] = 94;

$sum = array_sum($arr); 

echo $sum; 

Отображение в браузере:

126

Если, требуется избавиться от элементов с повторяющимся значением, то стоит использовать функцию array_unique:

$arr = array(30, 44, 97, 30);
print_r($arr); 

$new_arr = array_unique($arr);
print_r($new_arr); 

Отображение в браузере:

Array ( [0] => 30 [1] => 44 [2] => 97 [3] => 30 ) 
Array ( [0] => 30 [1] => 44 [2] => 97 )

Многомерные массивы в PHP

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

$companies["Microsoft"] = "Programmer"; 
$companies["Google"] = "IT"; 
$companies["Mozilla"] = "PR";

А если компания имеет несколько предложений, то тут уже нужно использовать многомерные массивы:

$companies["Microsoft"][1] = "Programmer"; 
$companies["Microsoft"][2] = "PR"; 
$companies["Microsoft"][3] = "Office Manager"; 

$companies["Google"][1] = "IT"; 
$companies["Google"][2] = "Web-design"; 

$companies["Mozilla"][1] = "PR";
$companies["Mozilla"][2] = "C++ Programmer";

print_r($companies);

Отображение в браузере:

Array ( 
[Microsoft] => Array ( [1] => Programmer [2] => PR [3] => Office Maneger )
[Google] => Array ( [1] => IT [2] => Web-design ) 
[Mozilla] => Array ( [1] => PR [2] => C++ Programmer )
)

Также, эту конструкцию можно было записать так:

$companies = [
  "Microsoft" => ["Programmer", "PR", "Office Manager"], 
  "Google" => ["IT", "Web-design"], 
  "Mozilla" => ["PR", "C++ Programmer"]
];

// можете используйте тег pre для форматирования вывода
echo "<pre>";
print_r($companies);
echo "</pre>";

Отображение в браузере:

Array
(
  [Microsoft] => Array
    (
      [0] => Programmer
      [1] => PR
      [2] => Office Manager
    )

  [Google] => Array
    (
      [0] => IT
      [1] => Web-design
    )

  [Mozilla] => Array
    (
      [0] => PR
      [1] => C++ Programmer
    )

)

Использование циклов в многомерных массивах в PHP

Если нам нужно перебрать (вывести на экран) элементы обычного массива, то мы можем использовать циклы. Мы также можем использовать циклы и для многомерных массивов, только нужно немножко подправить код. Рассмотрим пример:

// Создание массива
$companies[0][] = "Programmer"; 
$companies[0][] = "PR"; 

$companies[1][] = "IT"; 
$companies[1][] = "Web-design"; 

$companies[2][] = "PR";
$companies[2][] = "C++ Programmer";

// Вывод массива на экран
for($i = 0; $i < count($companies); $i++) {
  for($j = 0; $j < count($companies[$i]); $j++) {
    echo $companies[$i][$j], "<br />";
  }
}

Переменная $i отвечает за счет в первых квадратных скобках массива, а переменная $j за счет во вторых квадратных скобках массива. Второй цикл FOR работает, пока в массиве не закончатся элементы определенного индекса.

Операторы над массивами в PHP

В PHP, помимо специальных функций для работы с массивами, есть операторы, которые выполняют следующие действия:

  • $a + $b - Объединение.
  • $a == $b - Равно.
  • $a === $b - Тождественно равно.
  • $a != $b - Не равно.
  • $a <> $b - Не равно.
  • $a !== $b - Тождественно не равно.

Тождественно равно — когда значения и типы данных одинаковые. Пример:

var_dump(1 === "1"); // integer === string -> false
var_dump(1 === 1); // integer === integer -> true

Функции

Функции в PHP, их синтаксис, создание и вызов

Функция - это набор операторов, который идентифицируется определенным идентификатором (именем). Проще всего разобраться что же такое функция, это посмотреть на пример:

function square($num)
{
  $square = $num * $num;
  echo $square;
}   

square(7);

Это простая функция, которая рассчитывает квадрат числа.

Сначала, мы создаем функцию прописывая ключевое слово function, после которого мы можем задать любое имя для нашей функции, в нашем случае это имя - square. В скобках мы передаем аргумент функции (то, что нам нужно посчитать), в нашем случае это переменная - $num (какое-нибудь число).

Далее, в теле функции, мы прописываем все, что мы хотим, чтобы функция выполняла. В нашем случае, функция задает переменной $square квадрат числа, которое находится в $num, после мы просто выводим результат функции $square, с помощью оператора echo.

После этих действий, мы можем в любой части нашей страницы вызвать созданную функцию вот так: square(какое-нибудь число);.

Формальный синтаксис описания функции:

function name([argument_list...])
{
  [statemetns;]
  [return value;]
}

Как в PHP передать данные в функцию

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

Давайте применим эти знания на практике. Допустим, нам нужно посчитать значение некой функции z = cos(x) + sin(y) + 2. Для подсчета значения z, мы можем написать функцию и передать два аргумента: x и y. Код:

function myfunc($x,$y) {
  $res = cos($x) + sin($y) + 2;
  return $res;
}

$x = 5;
$y = 7;

$z = myfunc($x,$y);

echo $z;

Оператор return нужен для того, чтобы функция возвращала какое-то значение. В нашем случае, мы посчитали нужное нам выражение, занесли его в переменную $res и вернули через оператор return. Если бы мы этого не сделали, то переменная $z была бы пустая.

В результате выполнения данной функции, мы получим такой результат:

2.940648784182

Значение по-умолчанию для аргументов функции PHP

Давайте посмотрим на следующую функцию:

function hello($text) {
  echo $text;
}

hello('Привет');

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

Что будет, если не передать значение для аргумента, т.е., что будет если вызвать просто hello():

Warning: Missing argument 1 for hello(), called in...

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

Значения по-умолчанию задаются так:

function hello($text = "Привет") {
  echo $text;
}

hello('Добрый день');

echo "<br/>";

hello();

Результат выполнения этого кода:

Добрый день
Привет

Первый вызов функции hello('Добрый день') выведет: Добрый день, второй вызов функции hello() без передачи значения выведет: Привет (потому что, мы указали значение по-умолчанию).

ООП

Введение в ООП

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

ООП расшифровывается как объектно-ориентированное программирование. Это парадигма (совокупность идей и понятий) программирования, в которой основными концепциями являются понятия объектов и классов.

Абстракция — абстрагирование, это способ описания общих характеристик объекта.

Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе, и скрыть детали реализации от пользователя.

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

Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

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

Объект — это экземпляр класса, совокупность данных (свойств) и функций (методов) для обработки данных.

Это все, сухие определения, но их нужно знать (или о них нужно знать), чтобы было хотя бы какое-то понимание про ООП.

Классы

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

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

class FirstClass
{
  ...
}

Объекты

Для создания экземпляра (объекта) класса используется директива new.

Пример создания объекта:

$instance = new FirstClass();

// Это можно сделать и с помощью переменной:
$className = 'FirstClass';
$instance = new $className(); // FirstClass()

Конструкторы, деструкторы

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

Синтаксис:

function __construct(mixed $args = "") { // можно передавать параметры
  ...
}

Использование:

class FirstClass
{
  function __construct($hello = "hi") {
   return $hello;
  }
}

$instance = new FirstClass(); // вернет строку "hi"
$instance = new FirstClass("hello"); // вернет строку "hello"

Также, в PHP представлены деструкторы. Деструктор будет вызван при освобождении всех ссылок на определенный объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).

Пример:

class FirstClass
{
  function __destruct() {
   echo "Вызов деструктора";
  }
}

Свойства и функции

Переменные в классе, называются "свойствами". Также их называют, используя другие термины, такие как "атрибуты" или "поля". Они определяются с помощью ключевых слов public, protected, или private, следуя правилам правильного описания переменных.

Пример определения свойств:

class FirstClass {
  public $var1 = "hello";
  private $var2 = 25;
  protected $var3 = ["one", "two"];
}

Ключевые слова public, protected, private это область видимости (будет рассмотрено в следующем уроке).

Функция в классах называются "методом". Процесс описания метода происходит как при описании обычной функции. Например:

class FirstClass {

  public function firstFunction() {
    $a = 25;
    $b = 35;
    return $a + $b;
  }
}

В пределах методов класса доступ к свойствам может быть получен с помощью -> (объектного оператора) и указателя $this, например $this->var1 (где var1 – имя переменной) или $this->firstFunction() (где, firstFunction – имя метода).

Пример:

class FirstClass {
  private $var1;

  public function setVar1($value) {
     $this->var1 = $value;
  }
}

$instance = new FirstClass();

$instance->setVar1("orange"); // установим значение "orange" для переменной var1

Константы

Отличие переменных и констант состоит в том, что при объявлении последних или при обращении к ним не используется символ $.

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

Начиная с версии PHP 5.6, вы можете использовать математические операции для определения констант.

Объявление и использование константы:

class FirstClass {
  const CONSTANT = "value";
  const CONSTANT2 = 80 * 2 + 40; // >= PHP 5.6
}

// доступ к константе
echo FirstClass:: CONSTANT;

// через метод в классе
class FirstClass {
  const CONSTANT = "orange";

  function myFunc() {
     echo self::CONSTANT;
  }
}

Область видимости

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

  • public — элементы доступны всем.
  • private — элементы не доступны извне (за пределами класса).
  • protected — элементы доступны только классу и всем его потомкам (будет рассмотрено).

Пример:

class FirstClass {
  public $var1 = "public";
  private $var2 = "private";
  protected $var3 = "protected";

  public function func1() {
    echo $this->var1;
    echo $this->var2;
    echo $this->var3; 
  }

  private function func2() {
  }

  protected function func3() {
  }
}

$instance = new FirstClass();

$instance->var1; // работает
$instance->func1(); // работает, результат: public private protected
$instance->var2; // ошибка
$instance->var3; // ошибка
$instance->func2(); // ошибка
$instance->func3(); // ошибка

Методы, где определение области видимости отсутствует, определяются как public.

Наследование

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

Такой подход полезный для абстрагирования функциональности. Позволяет реализовать дополнительную функциональность в похожих объектах без необходимости реализовывать всю общую функциональность.

Чтобы создать наследование от другого класса нужно использовать оператор extends.

Пример наследования:

class FirstClass {
  public $var1 = "value1";

  protected function func1() {
  }

  public function func2() {
  }
}

class SecondClass extends FirstClass {
  public $var2 = "value2";
}

$fc = new FirstClass();
$sc = new SecondClass();

echo $fc->var1; // value1
echo $sc->var1; // value1
$sc->func2(); // работает
echo $sc->var2; // value2

Если мы попытаемся вызвать метод $sc->func1(), то получим ошибку, из-за того, что метод func1 определен в родительском классе как protected, он не может быть вызван снаружи.

$sc->func1(); // не работает, метод защищен (protected)

Абстрактные классы

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

При наследовании от абстрактного класса, все методы, помеченные абстрактными в родительском классе, должны быть определены в классе-потомке; кроме того, область видимости этих методов должна совпадать (или быть менее строгой). Более того, контроль типов (будет рассмотрено) и количество обязательных аргументов должно быть одинаковым.

Пример абстрактного класса:

abstract class AbstClass {
  /* Данный метод должен быть определён в дочернем классе */
  abstract protected function getValue();

  /* Общий метод */
  public function printValue() {
    print $this->getValue() . "\n";
  }
}

class FirstClass extends AbstClass
{
  protected function getValue() {
    return "FirstClass";
  }  
}

$class1 = new FirstClass;
$class1->printValue();

Результат:

FirstClass

Ключевое слово static

Объявление свойств и методов класса статическими static позволяет обращаться к ним без создания экземпляра класса. Атрибут класса, объявленный статическим, не может быть доступен посредством экземпляра класса (но статический метод может быть вызван).

Доступ к статическим свойствам класса может быть получен через оператор ::.

Начиная с версии PHP 5.3.0 существует возможность ссылаться на класс используя переменную. Поэтому значение переменной в таком случае не может быть ключевым словом (например, self, parent и static).

Пример статического свойства

class FirstClass
{
  public static $var1 = "var1";

  public function staticValue() {
    return self::$var1;
  }
}

class SecondClass extends FirstClass
{
  public function var1Static() {
    return parent::$var1;
  }
}

echo FirstClass::$var1; 

Пример статического метода

class FirstClass {
  public static function myStaticMethod() {
    // ...
  }
}

FirstClass::myStaticMethod(); // вызов метода

Интерфейсы

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

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова interface. Тела методов интерфейсов должны быть пустыми.

Методы, внутри интерфейса, должны быть определены как публичные.

Пример описания интерфейса:

// Объявим интерфейс 'CarTemplate'
interface CarTemplate
{
  public function getId(); // получить id автомобиля
  public function getName(); // получить название
  public function add(); // добавить новый автомобиль
}

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

Пример:

// Объявим интерфейс 'CarTemplate'
class Audi implements CarTemplate {
   function getId() {
     return "1-ATHD98";
  }

  function getName() {
     return "Audi";
  }

  function add() {
     // 
  }
}


class Bmw implements CarTemplate {
  function getId() {
     return "2-HHFY14";
  }

  function getName() {
     return "BMW";
  }

  function add() {
     // 
  }

}

Перегрузка и магические методы

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

Перегрузка свойств

Обращения к свойствам объекта могут быть перегружены с использованием методов __get и __set. Эти методы будут срабатывать в том случае, если объект не содержит свойства, к которому осуществляется доступ. Синтаксис:

public void __set (string $name , mixed $value)
public mixed __get (string $name)

Пример использования:

class MyClass {
    public $c = "c value";

    public function __set($name, $value) {
        echo "__set, property - {$name} is not exists \n";
    }

    public function __get($name) {
        echo "__get, property - {$name} is not exists \n";
    }
}

$obj = new MyClass;
$obj->a = 1; // запись в свойство (свойство не существует)
echo $obj->b; // получаем значение свойства (свойство не существует)
echo $obj->c; // получаем значение свойства (свойство существует)

Результат:

__set, property - a is not exists 
__get, property - b is not exists 
c value

Перегрузка методов

Вызовы методов могут быть перегружены с использованием методов __call. Эти методы будут срабатывать в том случае, если объект не содержит метода, к которому осуществляется доступ. Синтаксис:

public mixed __call (string $name , array $arguments)

Пример:

class MyClass {
    public function __call($name, $arguments) {
        return "__call, method - {$name} is not exists \n";
    }

    public function getId() {
        return "AH-15474";
    }
}

$obj = new MyClass;
echo $obj->getName(); // вызов метода (метод не существует)
echo $obj->getId(); // вызов метода (метод существует)

Результат:

__call, method - getName is not exists (при вызове getName)

AH-15474 (при вызове getId).

Магический метод __toString.

Метод __toString() будет срабатывать при попытке преобразования класса в строку. Например, echo $obj;.

Синтаксис:

public string __toString ()

Пример:

class MyClass {
    public function __toString() {
        return "MyClass class";
    }
}

$obj = new MyClass;
echo $obj; // результат: MyClass class

Магический метод __invoke()

Метод __invoke() вызывается, когда объект пытаются вызвать как функцию.

Синтаксис:

mixed __invoke ([ $... ] )

Пример:

class MyClass {
    public function __invoke($a) {
        return $a;
    }
}

$obj = new MyClass;
echo $obj(75); // результат: 75

Контроль типа

В PHP 5 есть возможность использования контроля типов. При передаче параметром есть возможность проверить данные на такие типы: объекты (путем указания имени класса в прототипе функции), интерфейсы, массивы, колбеки с типом callable.

Пример использования:

class MyClass {

    public function names(array $names) { // тип array
        $res = "<ul>";
        foreach($names as $name) {
            $res .= "<li>{$name}</li>";
        }
        return $res .= "</ul>";
    }

    public function otherClassTypeFunc(OtherClass $otherClass) { // тип OtherClass
        return $otherClass->var1;
    }
}

$obj = new MyClass;

$names = array(
    'Иван Андреев',
    'Олег Симонов',
    'Андрей Ефремов',
    'Алексей Самсонов'
);
echo $obj->names($names); // работает

$names = "Олег Симонов";

// получим фатальную ошибку: Argument 1 passed to MyClass::names() must be of the type array, string given
echo $obj->names($names); 

// получим фатальную ошибку: Argument 1 passed to MyClass::names() must be an instance of OtherClass, string given
echo $obj->otherClassTypeFunc("test string");

Пространства имен

Пространства имен, это один из способов инкапсуляции элементов. Такое абстрактное понятие можно увидеть во многих местах. Например, в операционной системе директории служат для группировки файлов и выступают в качестве пространства имен для находящихся в них файлов. В качестве примера файл text.txt может находиться сразу в нескольких директориях: /files и /docs, но две копии text.txt не могут существовать в одной директории. Также, для доступа к text.txt извн, мы должны добавить имя директории перед именем файла используя разделитель (/files /text.txt). Такой же принцип распространяется и на пространства имен.

В PHP пространства имен используются для решения двух проблем:

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

Допустим, у нас такая файловая структура:

  • -- App
  • --- Main
  • ---- MyClass.php
  • - namespace.php

Опишем класс MyClasss.php:

// App/Main/MyClass.php

namespace App\Main;

class MyClass { 
    function hello() {
        return "hello";
    }
}

С помощью пространства имен мы можем получить доступ к классу MyClass (файл namespace.php):

// namespace.php

namespace App\Main;

require_once "App\Main\MyClass.php";

$obj = new \App\Main\MyClass;
echo $obj->hello(); // hello

Исходя из описания, мы можем создать такой же класс, только в другой директории. Давайте создадим класс с таким же названием в папке App/Core.

// App/Core/MyClass.php

namespace App\Core;

class MyClass { 
    function hello() {
        return "hello, it's core";
    }
}

Получим доступ к этому классу:

namespace App\Core;

require_once "App\Core\MyClass.php";

$obj = new \App\Core\MyClass;
echo $obj->hello(); // hello it’s core

Создание псевдонима имени

Псевдонимы для пространства имен используются для более простого доступа к нужному пространству. Например, у вас такая структура namespace App/Core/Controller/, чтобы получить доступ к одному из классов, нужно будет написать весь этот путь - App/Core/Controller/AppController. Намного проще было бы написать CoreController/AppController. Это можно реализовать с помощью псеводнимов.

Для создания псевдонима используют ключевое слово use. Пример:

use App/Core/Controller as CoreController;

// …

$app = new CoreController/AppController;

Трейты

Начиная с версии 5.4.0 в PHP есть возможность использования инструментария для повторного использования кода. Он называется — трейт.

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

Пример написания:

trait MyTrait {
    public function myFunc() {
        return 2 + 2;
    }
}

Рассмотрим пример использования трейта на основе создания "Транслитератора" (суть: буквы кириллицы переводим в латиницу).

trait MyTransliterator {
    private $letters = array(
    'а' => 'a',     'б' => 'b',   'в' => 'v',
    'г' => 'g',     'д' => 'd',     'е' => 'e',
    'ё' => 'e',     'ж' => 'zh',    'з' => 'z',
    'и' => 'i',     'й' => 'y',     'к' => 'k',
    'л' => 'l',     'м' => 'm',     'н' => 'n',
    'о' => 'o',     'п' => 'p',     'р' => 'r',
    'с' => 's',     'т' => 't',     'у' => 'u',
    'ф' => 'f',     'х' => 'h',     'ц' => 'c',
    'ч' => 'ch',    'ш' => 'sh',    'щ' => 'sch',
    'ь' => '',      'ы' => 'y',     'ъ' => '',
    'э' => 'e',     'ю' => 'yu',    'я' => 'ya',
    'А' => 'A',     'Б' => 'B',     'В' => 'V',
    'Г' => 'G',     'Д' => 'D',     'Е' => 'E',
    'Ё' => 'E',     'Ж' => 'Zh',    'З' => 'Z',
    'И' => 'I',     'Й' => 'Y',     'К' => 'K',
    'Л' => 'L',     'М' => 'M',     'Н' => 'N',
    'О' => 'O',     'П' => 'P',     'Р' => 'R',
    'С' => 'S',     'Т' => 'T',     'У' => 'U',
    'Ф' => 'F',     'Х' => 'H',     'Ц' => 'C',
    'Ч' => 'Ch',    'Ш' => 'Sh',    'Щ' => 'Sch',
    'Ь' => '',  'Ы' => 'Y',     'Ъ' => '_',
    'Э' => 'E',     'Ю' => 'Yu',    'Я' => 'Ya',
    'є' => 'ye',    'ї' => 'yi',    'і' => 'i',
    'Є' => 'YE',    'Ї' => 'YI',    'І' => 'I',
    ' ' => '_'
  );

    public function translate($str) {
        // заменяем символы кириллицы на символы латиницы
        return strtr(trim($str), $this->letters);
    }
}

class MyClass {
    use MyTransliterator;

    private $data;

    /**
    *   Некая функция для добавления данных в наш массив 
    */
    public function setData(array $data) {
        $this->data = $data;
    }

    /**
    *    Некая фукнция для подготовки данных
    */
    public function getPreparedData() {
        // допустим, мы хотим сделать адрес страницы по названию
        // тогда, нам нужно перевести название с кириллическими символами на латиницу
        $this->data['url'] = strtolower($this->translate($this->data['title']));

        return $this->data;
    }
}

$obj = new MyClass;

$obj->setData([
    'title' => 'Не очень простое название для страницы',
    'content' => 'Текст страницы'
]);

$data = $obj->getPreparedData();

echo "<pre>";
print_r($data);
echo "</pre>";

Результат:

Array
(
  [title] => Не очень простое название для страницы
  [content] => Текст страницы
  [url] => ne_ochen_prostoe_nazvanie_dlya_stranicy
)
На этой странице