Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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

Глобальные переменные

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

global $var1, $var2;<?$a=1;function Test_g(){global $a; $a = $a*2; echo 'в результате работы функции $a=',$a;}echo 'вне функции $a=',$a,', ';Test_g();echo "<br>";echo 'вне функции $a=',$a,', ';Test_g();?>

Пример 7. Глобальные переменные

В результате работы этого скрипта получим:

вне функции $a=1, в результате работы функции $a=2вне функции $a=2, в результате работы функции $a=4

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

$var1 = &$GLOBALS["var1"];$var2 = &$GLOBALS["var2"];

Это значит, например, что удаление переменной $var1 не удаляет глобальной переменной $GLOBALS["var1"].

Статические переменные

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

static $var1, $var2;

Статической переменной может быть присвоено любое значение, но не ссылка.

<?function Test_s(){static $a = 1; // нельзя присваивать выражение или ссылку $a = $a*2; echo $a;}Test_s(); // выведет 2echo $a; // ничего не выведет, так как // $a доступна только // внутри функцииTest_s(); // внутри функции $a=2, поэтому // результатом работы функции // будет число 4?>

Пример 8. Использование статической переменной

Возвращаемые значения

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

Например, составим функцию, которая возвращает возраст человека. Если человек не умер, то возраст считается относительно текущего года.

<?php/* если второй параметр вычисляется как true, то он рассматривается как дата смерти, */ function Age($birth, $is_dead){ if ($is_dead) return $is_dead-$birth; else return date("Y")-$birth;}echo Age(1971, false); // для 2017 года выведет 46echo Age(1971, 2001); // выведет 30?>

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

$an_age = Age(1981, 2004);

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

<?phpfunction Full_age($b_day, $b_month, $b_year){ $y = date("Y"); $m = intval(date("m")); $d = intval(date("d")); $b_month = intval($b_month); $b_day = intval($b_day); $b_year = intval($b_year); $day = ($b_day > $d? 30 - $b_day + $d: $d - $b_day); $tmpMonth = ($b_day > $d? -1: 0); $month = ($b_month > $m + $tmpMonth? 12 - $b_month + $tmpMonth + $m: $m+$tmpMonth - $b_month); $tmpYear = ($b_month > $m + $tmpMonth? -1: 0); if ($b_year > $y + $tmpYear) { $year = 0; $month = 0; $day = 0; } else { $year = $y + $tmpYear - $b_year; } return array ($day,$month,$year);}$age = Full_age("29","06","1986");echo "Вам $age[2] лет, $age[1] месяцев и $age[0] дней";?>

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

<?// задание функции Full_age()list($day,$month,$year) = Full_age("07", "08","1974");echo "Вам $year лет, $month месяцев и $day дней";?>

Вообще конструкцию list () можно использовать для присвоения переменным значений элементов любого массива.

<?$arr = array("first","second");list($a,$b) = $arr; // переменной $a присваивается первое // значение массива, $b – второеecho $a," ",$b; // выведет строку "first second"?>

Пример 9. Использование list()

Возвращение ссылки

В результате своей работы функция также может возвращать ссылку на какую-либо переменную. Это может пригодиться, если требуется использовать функцию для того, чтобы определить, какой переменной должна быть присвоена ссылка. Чтобы получить из функции ссылку, нужно при объявлении перед ее именем написать знак амперсанд (&) и каждый раз при вызове функции перед ее именем тоже писать амперсанд (&). Обычно функция возвращает ссылку на какую-либо глобальную переменную (или ее часть – ссылку на элемент глобального массива), ссылку на статическую переменную (или ее часть) или ссылку на один из аргументов, если он был также передан по ссылке.

<?$a = 3; $b = 2;function & ref($par){global $a, $b; if ($par % 2 == 0) return $b; else return $a;}$var =& ref(4);echo $var, " и ", $b,"<br>"; //выведет 2 и 2$b = 10;echo $var, " и ", $b,"<br>"; // выведет 10 и 10?>

Пример 10. Возвращение ссылки

При использовании синтаксиса ссылок в переменную $var нашего примера не копируется значение переменной $b возвращенной функцией $ref, а создается ссылка на эту переменную. То есть теперь переменные $var и $b идентичны и будут изменяться одновременно.

Переменные функции

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

<?/* создадим две простые функции: Add_sign – добавляет подпись к строке иShow_text – выводит строку текста */ function Add_sign($string, $sign="С уважением, Петр"){ echo $string." ".$sign;}function Show_text(){ echo "Отправить сообщение по почте<br>";}$func = "Show_text"; // создаем переменную со значением, // равным имени функции Show_text$func(); // это вызовет функцию Show_text$func = "Add_sign"; // создаем переменную со значением, // равным имени функции Add_sign$func("Привет всем <br>"); // это вызовет функцию // Add_sign с параметром "Привет всем"?>

Пример 11. Использование переменных функций

В этом примере функция Show_text просто выводит строку текста. Казалось бы, зачем для этого создавать отдельную функцию, если существует специальная функция echo(). Дело в том, что такие функции, как echo(), print(), unset(), include() и т.п. нельзя использовать в качестве переменных функций. То есть если мы напишем:

<?$func = "echo ";$func("TEXT");?>

то интерпретатор выведет ошибку:

Fatal error: Call to undefined function: echo() inc:\users\nina\tasks\func\var_f.php on line 2

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...