После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

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

2016-06-24
Основы PHP → Функции
Функции, Статические функции, Области видимости переменных, Возвращение значения, Инкапсуляция

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

Функции в PHP

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

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

Определение функции

Функция объявляется с помощью ключевого слова function. Если функция имеет параметры, они объявляются как переменные в объявлении функции:

function my_function($my_parameter)
{
   echo "Вы передали '$my_parameter' в функцию<br/>";
}

Вот и определение нашей первой функции. После ключевого слова function идет название функции. Мы назвали ее my_function. После этого в круглых скобках перечисляются параметры, которые мы хотим передать в функцию. В нашем случае мы описали параметр $my_parameter. Теперь внутри тела функции, которое заключается в фигурные скобки { и } , мы можем использовать переменную $my_parameter. В частности мы выводим ее значение внутри уже известного нам оператора echo.

Обратиться к нашей функции теперь можно следующим образом:

my_function("это мой параметр");

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

<?php
function my_function($my_parameter)
{
   echo "Вы передали '$my_parameter' в функцию
"; } my_function("это мой параметр"); my_function("а это мой новый параметр"); ?>

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

Вы передали 'это мой параметр' в функцию
Вы передали 'а это мой новый параметр' в функцию

Если требуется передать несколько параметров, то они разделяются запятой:

<?php
function my_function($my_parameter1, $my_parameter2)
{
   echo "you send '$my_parameter1' and " ."'$my_parameter2' to my function
"; } ?>

Функция всегда возвращает значение. Если это не указать явно, то будет возвращено NULL. Оператор return позволяет завершить выполнение функции, вернув конкретное значение. Смотрите пример ниже:

<?php
function my_function_sum($a, $b)
{
   return $a+$b;
}
   echo "если сложить 2 и 3, то получится ";
   echo my_function_sum(2, 3);
?>

Можно сохранять полученное из функции значение в переменной:
$sum = my_function_sum(2, 3);

Оператор return может ничего и не возвращать, а просто использоваться для выхода из функции. Смотрите пример ниже:

<?php
function not_1($a)
{
   if($a == 1)
      return;
   echo "очевидно, ваш параметр не равен 1";
}
not_1(1);
not_1(2);
not_1(3);
?>

Пустой return — это то же самое, что return NULL;

В данном случае строчка сообщения выведется только два раза, потому что в первом случае ( not_1(1); ) выполнится условие оператора if , отработает оператор return и произойдет выход из функции.

Значения по умолчанию

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

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

<?php
function sum($a, $b = 1)
{
   return $a + $b;
}
echo sum(1);
echo sum(1, 2);
?>

Сначала функция echo выведет значение 2, а потом 3. В первом случае мы вызвали функцию только с одним параметром, поэтому переменная $b (второй параметр) получила значение по умолчанию. Во втором случае, как и положено, переменной $b присваивается значение 2.

Рекурсия

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

Факториал nэто произведение всех натуральных чисел до n включительно. В математике факториал обозначается символом !. То есть, к примеру, 5! = 1 * 2 * 3 * 4 * 5.

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

<?php
function fact($x)
{
   if ($x == 1)
      return 1;
   else
      return $x * fact($x — 1);
}
?>

Область видимости и время жизни переменных

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

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

<?php
function printA()
{
   $a = 2;
   echo $a;
}

$a = 1;

echo $a;
printA();
echo $a;
?>
// выводит 1
// выводит 2
// выводит 1
?>

Переменная $a, объявленная внутри функции printA, не имеет никакого отношения к глобальной $a , объявленной сразу после функции. Когда интерпретатор выполняет инструкции внутри функции printA, ему не известно о каких-либо переменных, которые объявлены за пределами функции. Поэтому сценарий выводит последовательность "121".

Локальные переменные сохраняют свое значение только во время выполнения функции. При новом вызове функции значения локальных переменных инициализируются заново. Смотрите пример ниже:

<?php
function printA()
{
   $a = 0;
   $a++;
   echo $a;
}
printA();
printA();
printA();
?>

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

Однако есть исключение. Чтобы функция все же "помнила" значения уже инициализированных переменных, используется ключевое слово static. Таким образом, можно объявить статические переменные, которые инициализируются функцией только один раз:

<?php
function printA()
{
   static $a = 0;
   $a++;
   echo $a;
}
printA();
printA();
printA();
?>

Этот сценарий выведет последовательность "123", потому что обнуление $a происходит только при первом вызове функции. При последующих вызовах функции PHP будет знать, что переменная $a уже существует, и пропустит строчку со словом static.

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

Также в PHP существует специальная инструкция global, позволяющая функции работать с глобальными переменными. Рассмотрим данный принцип на примере:

<?php
$a = 1;
$b = 2;

function Sum()
{
   global $a, $b;
   $b = $a + $b;
}

Sum();
echo $b;
?>

Данный сценарий выведет значение 3. Первой строкой функции идет инструкция
global $a, $b;
Это значит, что при дальнейшем сложении $b = $a + $b; будут использоваться глобальные переменные, объявленные вне функции.

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

В заключение

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

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

Стоит помнить, что большинство велосипедов уже изобретено. Поэтому перед тем как писать функцию вычисления синуса, нужно поинтересоваться, не решена ли уже ваша задача стандартными средствами PHP, или же какой-нибудь специальной библиотекой, которых в Интернете достаточно? ;)

576
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока