PHP: Функции
В этой главе:
-
Определение и вызов
-
Аргументы и параметры
-
Передача аргументов
-
Значение, возвращаемое функцией
-
Обращение к функциям через переменные
-
Анонимные функции
Функция - это именованный блок кода, в данном случае на языке PHP, который определяется один раз, а затем может вызываться на исполнение сколько угодно раз.
Примеры функций (встроенных в PHP) вы уже видели - это var_dump(), unset(). В этой главе вы узнаете, как создавать свои функции.
Определение и вызов
Определение функции выполняется с помощью ключевого слова function за которым указываются следующие компоненты:
-
Идентификатор, определяющий имя функции. Он будет использован для создания новой переменной, которой будет присвоена функция. Имена функций следуют тем же правилам, что и именование переменных. Замечание: имена функций не чувствительны к регистру букв.
-
Пара круглых скобок вокруг списка из нуля или более идентификаторов, разделенных запятыми. Эти идентификаторы будут определять имена параметров функции. В теле функции они используются в качестве локальных переменных.
-
Пара фигурных скобок с нулем или более инструкций. Эти инструкции составляют тело функции: они выполняются при каждом вызове функции.
Синтаксис определения функции выглядит следующим образом:
1
|
function имя_функции([параметры]) { блок кода } |
Квадратные скобки ([]) означают необязательность. Теперь приведем простой пример определения функции:
1
2
3
4
5
6
7
|
<?php function hello() { echo "Привет из функции" ; } ?> |
Для вызова функции используется оператор вызова, представляющий из себя пару круглых скобок. Завершается вызов функции как и все инструкции точкой с запятой (;):
1
2
3
4
5
6
7
8
9
10
|
<?php function hello() { echo "Привет из функции" ; } // вызов функции hello(); ?> |
При вызове функции исполняются инструкции расположенные в ее теле.
Функции допускается определять в любом месте программы, это значит, что они не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php $makefunc = true; /* Здесь нельзя вызвать функцию foo(), так как она еще не определена (оператор if еще не сработал). Но мы можем вызвать здесь функцию bar(), так как она определена уже cнизу */ bar(); // вызываем так как функция уже определена if ( $makefunc ) { // функция foo определяется только сейчас function foo() { echo "Я не существую до тех пор, пока выполнение программы меня не достигнет.\n" ; } } /* Теперь мы можем вызывать функцию foo(), поскольку $makefoo была интерпретирована как true */ foo(); function bar() { echo "Я существую сразу с начала старта программы.\n" ; } ?> |
Все функции в PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если были определены внутри и наоборот:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php function func1() { function func2() { echo "Я не существую пока не будет вызвана func1().\n" ; } } /* пока нельзя вызвать func2(), поскольку она еще не определена. */ func1(); /* Теперь можно вызвать функцию func2(), вызов func1() сделал ее доступной. */ func2(); ?> |
Чаще всего функции работают с каким-либо переданными ей значениями. Для того, чтобы функции можно было передать некоторые значения, в ней должны быть указаны параметры. Эти параметры по сути являются обычными переменными, которые инициализируются переданными значениями при вызове функции.
Аргументы и параметры
Параметры указываются в определении функции, внутри круглых скобок, и являются ее локальными переменными, т.е. они видны только в ее теле, если параметров несколько, то они указываются через запятую. При вызове функция может получать аргументы, с помощью которых инициализируются параметры.
Что такое параметры мы рассмотрели, теперь узнаем о том, какими значениями они инициализируются. Значения, которые будут присвоены параметрам называются аргументами - это может быть например строковой или целочисленный литерал, переменная или какое-нибудь более сложное выражение состоящее из переменных и операторов, но которое может быть вычислено интерпретатором PHP для получения значения, которым будет инициализирован параметр. Проще говоря, аргумент - это переданное функции значение:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php // Определение функции function my_car( $car , $color ) { // Указано два параметра: $car и $color echo "Марка моей машины: $car и она имеет $color цвет" ; } $color = 'красный' ; // Вызываем функцию и передаем ей два аргумента my_car( 'BMW' , $color ); // Аргументы - строковой литерал и переменная ?> |
Передача аргументов
PHP поддерживает два способа передачи аргументов функции. Первый - передача аргументов по значению (работает по умолчанию), второй - передача аргументов по ссылке. Также PHP поддерживает значения по умолчанию. Давайте теперь рассмотрим все три варианта подробнее.
По умолчанию аргументы передаются в функцию по значению (это значит, если вы измените значение параметра внутри функции, то вне ее переданное значение останется прежним):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php function foo( $color ) { $color = 'синий' ; // изменили значение параметра echo "Внутри функции параметр \$color имеет значение: $color" ; } $color = 'красный' ; foo( $color ); // Аргумент - значение переменной $color echo "<br>$color цвет" ; // Значение переменной не изменилось ?> |
Если необходимо разрешить функции изменять переданные аргументы за ее пределами, вы должны передавать их по ссылке. Для того, чтобы аргумент был передан по ссылке, необходимо указать знак & (амперсанд) перед именем параметра в определении функции:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php function foo(& $my_color ) { // теперь параметр будет ссылаться на оригинальное значение $my_color = 'синий' ; // присваиваем новое значение } $color = 'красный' ; foo( $color ); echo $color ; // выведет: синий ?> |
Функции могут определять значения аргументов по умолчанию. Чтобы установить значение по умолчанию, в определении функции нужно всего лишь присвоить параметру желаемое значение:
1
2
3
4
5
6
7
8
9
10
|
<?php function tea( $str = 'зеленый' ) { return "В чашке $str чай<br>\n" ; } echo tea(); // выведет значение по умолчанию echo tea( 'черный' ); ?> |
Примечание: все параметры, для которых установлены значения аргументов по умолчанию, должны находиться правее аргументов, для которых значения по умолчанию не заданы, так как в противном случае ваш код может работать не так, как вы того ожидали:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php // данный пример вызовет ошибку function my_car( $car = 'Mazda' , $color ) { echo "Марка моей машины: $car и она имеет $color цвет" ; } my_car( 'красный' ); // Не будет работать так, как мы могли бы ожидать // корректный пример function my_car( $color , $car = 'Mazda' ) { echo "Марка моей машины: $car и она имеет $color цвет" ; } my_car( 'красный' ); ?> |
Значение, возвращаемое функцией
Когда выполнение функции завершается, она может возвратить некоторое значение (результат работы функции) программе, которая ее вызвала. Оператор return внутри функций служит для определения значения, возвращаемого функцией. В качестве возвращаемого значения может быть любой тип. Он имеет следующий синтаксис:
1
|
return выражение; |
Оператор return может быть расположен в любом месте функции. Когда до него доходит управление, функция возвращает значение (если указано) и завершает свое выполнение. Если оператор return не указан или не указано возвращаемое значение, то функция вернет значение NULL. Для использования возвращаемого значения, результат выполнения функции можно присвоить к примеру переменной:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php function sqr( $num ) { return $num * $num ; } $x = sqr(4); echo "$x <br>" ; // => 16. function foo( $num ) { if ( $num === 10) return "$num равно 10" ; else return "$num не равно 10" ; echo 'hello' ; // эта строка кода никогда не выполнится } echo foo(6); ?> |
Обращение к функциям через переменные
Функцию можно присвоить переменной, так же как и обычное значение. Для этого имя функции должно быть присвоено переменной в виде строки, но без указания круглых скобок:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php function foo() { echo "функция foo()<br>\n" ; } $my_func = 'foo' ; // Теперь мы можем запустить функцию foo() при помощи переменной $my_func, // которая хранит имя указанной функции в виде строки $my_func (); // Вызываем функцию foo() ?> |
Такая концепция PHP имеет название «переменные-функции». Она заключается в том, что если добавить к переменной в конце круглые скобки, то интерпретатор PHP проверит сначала, не существует ли функции с именем равным значению переменной и если такая функция есть - выполнит ее.
Так, как показано в примере выше, можно делать только с функциями определенными пользователями. Встроенные языковые конструкции и функции, такие как echo, unset(), isset() и другие подобные им нельзя таким же образом напрямую присвоить переменным. Но можно сделать свою функцию-обертку (wrapper) для того, чтобы встроенные языковые конструкции могли работать подобно пользовательским функциям.
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php // Функция-обертка для echo function foo( $str ) { echo $str ; } $my_func = 'foo' ; $my_func ( 'test' ); // Вызывает функцию foo() ?> |
Анонимные функции
PHP позволяет определять анонимные функции. Такое название произошло за счет того, что такие функции создаются без определенного имени, иногда можно встретить и другое название таких функций - лямбда функция. Они определяются и присваиваются переменным, как обычные значения:
1
2
3
4
5
6
7
8
9
|
<?php $my_func = function ( $str ) { echo "hello $str" ; }; // точка с запятой обязательна $my_func ( 'World!' ); ?> |
Обратите внимание на пример, в конце определения функции есть точка с запятой, так как анонимная функция является по своей сути значением, и мы присваиваем значение переменной, то в конце как и для обычных инструкций ставится точка с запятой.
Анонимные функции отличаются от именованных тем, что создаются только в тот момент, когда до них доходит выполнение, поэтому воспользоваться ими можно только после их определения:
1 2 3 4 5 6 7 8 9 10 |
<?php // этот пример вызовет ошибку $my_func ( 'World!' ); $my_func = function ( $str ) { echo "hello $str" ; }; ?> |