Вы находитесь на странице: 1из 3

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 24. ФУНКЦИИ. ТИПЫ ВОЗВРАЩАЕМЫХ АРГУМЕНТОВ. ОБЛАСТИ


ВИДИМОСТИ. ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ. МАССИВ
$GLOBALS

Типы аргументов и возвращаемого значения


Помимо рассмотренных ранее параметров функции, существуют другие
дополнительные возможности ее точной настройки. Одной из них является
возможность задавать строгие типы аргументов и возвращаемого значения
функции. Выглядит это следующим образом:
function func_name(type arg1 = def1, type arg2 = def2, …, type arg3 = def3) : type {
тело_функции;
return;
}
Заданная таким образом функция примет аргументы с учетом их перевода в
указанный тип. Кроме того, будет преобразовано и возвращаемое значение
функции. Рассмотрим на примере:
Листинг 24.1. Функция со строгими типами аргументов и
возвращаемого значения

function type_func(int $var1, int $var2, string $var3) : string {


$sum = $var1 + $var2;
return "<p>".$var3." = ".$sum."</p>";
}

$var = type_func(14.5, "128.674", "Result");


echo "Переменная var1: ".$var;
echo "<p>Тип переменной var1: ".gettype($var)."</p>";

В результате выполнения этого скрипта Вы увидите результат сложения


переменных $var1 и $var2, приведенных к типу integer. В результате произойдет
сложение чисел 14 и 128, а не 14,5 и строки «128.674». В результате работы
функции получится строковое значение, содержащее все три параметра.
Как итог – результат на экране браузера:
Переменная var1:
Result = 142
Тип переменной var1: string
В случае, если Вы не уверены в типе поступающих в функцию данных, можно
воспользоваться таким способом приведения к требуемому для Ваших
вычислений.

Область видимости переменных. Локальные и глобальные переменные.


В предыдущих уроках упоминался термин «область видимости» переменных,
точнее, тот факт, что все переменные, используемые в функциях, по умолчанию
являются локальными.
Локальная переменная – переменная, срок жизни которой ограничивается
рамками той конструкции, внутри которой она объявлена. Так, объявленная в
функции переменная $a будет удалена из памяти при завершении выполнения
данной функции. Еще один интересный момент – переменная $a, объявленная вне

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

тела функции и переменная $a, объявленная внутри тела функции являются


абсолютно независимыми переменными.
Рассмотрим это явление на примере листинга 24.2.
Листинг 24.2. Локальные и глобальные переменные.

$var = "Global string";


echo "<p>Значение глобальной переменной var: $var</p>";

function new_func($var) {
$var = "Local string";
echo "<p>Значение локальной переменной var: $var</p>";
}

new_func($var);
echo "<p>Значение глобальной переменной var: $var</p>";

В результате работы кода из листинга 24.2. Вы получите на экране браузера


следующий результат:
Значение глобальной переменной var: Global string
Значение локальной переменной var: Local string
Значение глобальной переменной var: Global string
Как видите, значение переменной $var, находящейся за пределами функции
new_func() не изменилось.
Так что же делать, если необходимо использовать саму переменную, а нее ее
значение, которое попадает в функцию при ее объявлении?
В данной ситуации PHP предлагает нам два решения:
- использовать инструкцию global перед именем локальной переменной;
- использовать ссылку на элемент массива $GLOBALS, у которого имя ключа
содержит имя глобальной переменной.
При этом, оба метода являются, по сути, одним и тем же, только в разных
формулировках.
Так, следующие формулировки внутри тела функции по факту будут
синонимами и ссылаются на одну и ту же глобальную переменную $var:
global $var;
$var = &$GLOBALS[‘var’];
Проверим это на примере листинга 24.3.
Листинг 24.3. Использование глобальной переменной внутри тела
функции

//Создадим глобальную переменную $a, содержающую в себе массив-список дней


недели
$a = [
'Понедельник',
'Вторник',
'Среда',
'Четверг',
'Пятница',
'Суббота',

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

'Воскресенье'
];

//Вариант 1. Использование инструкции global


function days_global($n) {
global $a;
echo "<p>Выбранный Вами день недели - {$a[$n]}</p>";
}
days_global(3);

//Вариант 2. Использование ссылки на массив $GLOBALS


function days_GLOBALS($n) {
$a = &$GLOBALS['a'];
echo "<p>Выбранный Вами день недели - {$a[$n]}</p>";
}
days_GLOBALS(6);

Результат работы функций следующий:


Выбранный Вами день недели - Четверг
Выбранный Вами день недели – Воскресенье
Соответственно, скрипт вывел нам 4-й и 7-й дни недели, как мы того и хотели
(помните про нумерацию элементов массивов с 0!!!).
Таким образом, мы получаем два разных способа обращения к одной и той же
переменной – элементу массива $GLOBALS.
$GLOBALS – предобъявленный массив, содержащий в себе все объявленные в
программе переменные.
У этого массива есть несколько интересных особенностей:
- объявление нового элемента этого массива, фактически, равносильно
объявлению переменной именем, равным ключу нового элемента;
- этот массив невозможно присвоить другой переменной через оператор “=”;
- этот массив невозможно передать в функцию или конструкцию напрямую,
только через ссылку.