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";
  };
 
?>