Когда нужно отобразить текст на веб-странице, то оператор echo является наиболее употребляемым оператором в PHP. Как его иcпользовать - после слова echo нужно поместить строку текста в кавычки:
echo 'Привет от PHP';
// Отображение в браузере: Привет от PHP
Для отображения текста можно использовать как двойные кавычки, так и одинарные. Для чисел кавычки можно не использовать:
echo 2016;
Оператор echo также может участвовать в форматировании веб-страницы:
echo 'Петров Иван<br>Родился<br>...';
Для отображения большого количества текста используют т. н. синтаксис 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.
Значение переменной может быть отображено например так:
$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
Когда не нужно менять заданное значение для переменной, то имеет смысл создать константу и потом использовать ее в любой части скрипта. Для описания константы используют функцию 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:
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
Основным оператором присвоения является знак равенства =. Он присваивает значение определенной переменной:
$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
Если вы используете несколько операторов одновременно в одном выражении, то нужно знать в каком порядке они будут выполняться.
Эта таблица показывает операторы по убыванию приоритета (операторы с одним приоритетом выполняются слева на право):
new
[
! ~ ++ -- (int) (float) (string) (array) (object)
@
* / %
+ - .
< >
< <= > >=
&
^
|
&&
||
? :
= += -= *= /= .= %= &= |= ^= <= >=
print
and
xor
or
,
Для изменения порядка выполнения операторов нужно использовать круглые скобки!
В PHP существует такой оператор, как оператор исполнения, он нужен для того чтобы выполнять команды ОС и использовать результат этого выполнения.
Любая строка, которая заключена в обратные апострофы — ` считаются как команда ОС. Например:
$d = \`dir d:\`;
echo $d;
Как результат вы получите список директорий диска D.
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 (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 "Пожалуйста, уменьшите скорость!";
} // Конец
Отображение в браузере:
Превышение скорости!
Пожалуйста, уменьшите скорость!
При изучении условного оператора 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 "Скорость в пределах нормы";
Если нам нужно применить к выражению несколько условий, например: если больше 3 и меньше 6, то с помощью логических операторов мы можем это записать так:
$speed = 40;
if ($speed > 35 && $speed < 55) {
echo "Скорость в пределах нормы";
}
Полный список логических операторов представленный в таблице:
and
- логическое "И" - истина, если истинно $a и $b.&&
- логическое "И" - истина, если истинно $a и $b.or
- логическое "ИЛИ" - истина, если истинно $a или $b.||
- логическое "ИЛИ" - истина, если истинно $a или $b.xor
- логическое "исключающее ИЛИ" - истина, если истинно $a или $b, но не оба одновременно.!
- логическое "НЕ" - истина, если $a ложь.Как вы видите, в таблице присутствуют два оператора "И" и "ИЛИ". Это потому, что оператор &&
или ||
имеет больший приоритет от "И" и "ИЛИ".
Очень часто нужно при истинном значении выполнить одно действие, а при ложном другое. Для этого в PHP есть оператор else
. Синтаксис оператора:
if(exp)
statement1
else
statement2
Пример:
$speed = 50;
if ($speed > 60)
echo "Превышение скорости !";
else
echo "Скорость в пределах нормы"
// Выведит: Скорость в пределах нормы
Оператор 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
и мы увидели Превышение скорости!
.
Тернарный оператор работает почти также как и оператор 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 : "Другое значение";
Такой вариант полезно использовать, если нужно сначала проверить существует ли переменная. Если переменная не существует, то использовать какое-то другое значение.
Иногда даже использование конструкции операторов 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
. Ниже приведен его синтаксис:
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
, вместо использования счетчика цикла проверяет некоторое условие до того, пока это условие Истина (TRUE). Синтаксис:
while (exp) statement
Условие проверяется перед выполнением цикла, если оно будет Ложным в начале, то цикл не выполнится ни разу! В теле цикла должна быть переменная которая будет оказывать влияние на условие, чтобы предотвратить зацикливание. Пример:
$counter = 0;
while ($counter < 5)
{
echo "Эта строка выведется 5 раз <br>";
$counter++;
}
Отображение в браузере:
Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз
Эта строка выведется 5 раз
После вывода строки, переменная $counter
увеличивается на 1, и когда она станет больше или равна 5, то цикл завершится.
Главное отличие цикла DO ... WHILE от WHILE в том, что первый сначала выполняется тело цикла, а потом проверяет условие - если условие сразу Ложь, то цикл выполнится один раз. Синтаксис:
do
statement
while (condition)
Использование цикла DO... WHILE:
$counter = 6;
do
{
echo "Эта строка выведется 1 раз <br>";
$counter++;
}
while ($counter < 5);
Отображение в браузере:
Эта строка выведется 1 раз
Так как условие цикла сразу Ложь (6 > 5), то цикл выполнился всего один раз, так как сначала выполняется тело цикла, а потом проверяется условие цикла.
Цикл 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
Начиная с этого урока мы с вами открываем главу посвященную функциям для обработки строковых данных. С помощью этих фукнций можно, например, обрезать строку, дописывать строку, заменить часть строки и много другое. Это очень полезный инструмент и вы частенько будете использовать все эти функции при разработке своих скриптов.
Все функции для обработки строк перечислены ниже:
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
- преобразует первую букву строки в прописную.Как использовать несколько строковых функций для обработки текста.
Функция 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
.
Функция возвращает позицию первого вхождения подстроки в строку.
int strpos (string $string , mixed $needle [, int $offset = 0 ])
Первый параметр $string
- строка в которой будет произведен поиск, $needle
- строка, которую нужно найти, $offset
- необязательный параметр, если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Пример:
echo strpos("Hello world", "world"); // получим 6
В результате, получим 6, так как строка world
впервые встречается на 6 позиции
Для многобайтовых кодировок (например, для кириллицы) используйте функцию mb_strpos
с тем же синтаксисом что и в strpos
.
Массив - это набор данных, которые объединены под одним именем. Массив состоит из нескольких элементов, которые имеют свой определенный индекс.
Массивы создаются при помощи оператора присвоения, также как и переменная.
Имена массивов начинаются со знака $
, после которого следует произвольный идентификатор, далее идут квадратные скобки: $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"];
Нередко, нужно изменить значение того, или иного элемента массива, для этого нужно всего лишь обратится к элементу массива по его индексу и присвоить ему новое значение. Например, у нас есть массив:
$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
Если нам нужно удалить один из элементов массива, то для этого мы должны использовать функцию unset
:
$arr[0] = "PHP";
$arr[1] = "HTML";
$arr[2] = "CSS";
unset($arr[1]);
foreach($arr as $key => $value) {
echo $value.'<br/>';
}
Кроме использования цикла 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 предусмотрено очень много функций, полный список которых находиться ниже:
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 для этого существует достойное количество функций, поговорим именно о них.
Первая функция - 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 )
Навигация по массива дает возможно узнать текущий, следующий, предыдущий, последний элемента массива.
Для определения текущего элемента массива используют функцию 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 есть функция 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 )
Если есть потребность для массива, который проиндексированн строчными данным, присвоить значение переменным, одноименным с соответствующими индексами, то можно использовать функцию 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 )
Если вам нужно добавить в массив несколько элементов другого массива, то вам поможет функция 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 )
Если нужно проверить какой элемент совпадает в том, или ином массиве, или наоборот НЕ совпадает, то можно использовать функцию 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 имеет множество функций для обработки данных в массивах. Например, если нужно вычислить сумму всех элементов массив, то можно воспользоваться функцией 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 есть еще и многомерные массивы. Это такие массивы, какие имеют под одним индексом два или более значений. Например, есть массив 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
)
)
Если нам нужно перебрать (вывести на экран) элементы обычного массива, то мы можем использовать циклы. Мы также можем использовать циклы и для многомерных массивов, только нужно немножко подправить код. Рассмотрим пример:
// Создание массива
$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, помимо специальных функций для работы с массивами, есть операторы, которые выполняют следующие действия:
$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
Функция - это набор операторов, который идентифицируется определенным идентификатором (именем). Проще всего разобраться что же такое функция, это посмотреть на пример:
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;]
}
Функция может использовать данные, которые переданные ей при вызове. Для этой цели используется список аргументов, которые представляет собой перечень этих аргументов через запятую.
Давайте применим эти знания на практике. Допустим, нам нужно посчитать значение некой функции 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
Давайте посмотрим на следующую функцию:
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
позволяет обращаться к ним без создания экземпляра класса. Атрибут класса, объявленный статическим, не может быть доступен посредством экземпляра класса (но статический метод может быть вызван).
Доступ к статическим свойствам класса может быть получен через оператор ::
.
Начиная с версии 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()
вызывается, когда объект пытаются вызвать как функцию.
Синтаксис:
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 пространства имен используются для решения двух проблем:
Допустим, у нас такая файловая структура:
Опишем класс 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
)