#10 – Функции. Область видимости
Функции в PHP выполняют важную роль. Они обеспечивают сокращение кода за счет вынесения его в отдельные места. За урок мы научимся создавать функции и передавать в них значения.
Видеоурок
Функции можно назвать небольшими подпрограммами, куда можно вынести повторяющийся код и обращаться к нему, когда это будет нужно. Функции значительно облегчают построение программ, так как нам не надо копировать однотипный код множество раз, а можно просто воспользоваться одной общей функцией.
Многие путают функции и методы и не понимают отличий между ними. На самом деле отличий нет, так как что методы, что функции являются одним и тем же. Функции что записаны вне классов называют функциями, а функции что записаны внутри классов называются методами.
Точно такая же ситуация обстоит с переменным. В классах переменные называются полями, а вне классов — переменными.
В PHP функции создаются при помощи ключевого слова function . Каждая функция может иметь какие-либо параметры или же не иметь их вовсе. Функции способны что-либо возвращать в ходе выполнения кода, если это требуется.
Создание функции
На основе всех данных наша функция будет выглядеть следующим образом:
function test()
Функция выше не принимает никаких параметров и ничего не возвращает. Она просто пишет слово в консоль. Давайте разнообразим функцию и добавим параметр:
function test($word)
Теперь функция принимает параметр, который будет отображен в консоли.
Если функция должна что-либо вернуть, то прописываем тип данных который будет возвращен. Для возвращения данных используем ключевое слово return :
function test($some_number)
Область видимости
В PHP есть несколько полей видимости: локальная и глобальная. Если записать глобальную переменную, то такая переменная будем видна повсюду и с ней можно работать отовсюду в документе. Если записать локальную переменную, то такая переменная будет видна лишь в той области, где она записана.
Для создания глобальной переменной её необходимо прописать вне функции, класса или же объекта. Для создания локальных переменных вам достаточно поместить переменную в функцию. Переменная в функции будет видна лишь внутри блока с функцией и нигде более.
Если из функции мы хотим получить доступ к переменной записанной вне функции, то необходимо прописывать ключевое слово global :
$some = "Тест"; function getValue() < // echo $some; // Ничего не выведет echo global $some; // Выведет слово "Тест" >
Помимо этого можно создавать статические переменные, которые не будут становиться пустыми при новом их использовании:
function getNewValue() < // Создаем статическую переменную static $count = 0; $count += 4; echo $count; >getNewValue(); // Выведет 4 getNewValue(); // Выведет 8 getNewValue(); // Выведет 12 // и так далее
Весь код будет доступен после подписки на проект!
Какие области видимости есть в php
При использовании переменных и функций следует учитывать области видимости переменных. Область видимости задает область действия, доступности данной переменной.
Переменные в блоках цикла и условных конструкций
Блоки циклов и условных конструкций не образуют отдельной области видимости, и переменные, определенные в этих блоках, мы можем использовать вне этих блоков:
$condition = true; if($condition) < $name = "Tom"; >echo $name; // Tom
$i = 6; switch($i) < case 5: $name = "Tom"; break; case 6: $name = "Bob"; break; default: $name = "Sam"; break; >echo $name; // Bob
Локальные переменные
Локальные переменные создаются внутри функции. К таким переменным можно обратиться только изнутри данной функции. Например:
showName(); echo $name; // так написать нельзя, так как // переменная $name существует // только внутри функции showName( ?>
В данном случае в функции showName() определена локальная переменная $name . Соответственно обратиться в этой переменной мы можем только внутри функции showName() , но не вне ее.
То же самое относится и к параметрам функции: вне функции ее параметры также не существуют.
Статические переменные
На локальные переменные похожи статические. Они отличаются тем, что после завершения работы функции их значение сохраняется. При каждом новом вызове функция использует ранее сохраненное значение. Например:
getCounter(); // counter=1 getCounter(); // counter=2 getCounter(); // counter=3 ?>
Чтобы указать, что переменная будет статической, к ней добавляется ключевое слово static . При трех последовательных вызовах функции getCounter() переменная $counter будет увеличиваться на единицу.
Если бы переменная $counter была обычной нестатической, то при каждом вызове функция getCounter() выводила бы 1.
Как правило, статические переменные служат для создания различных счетчиков, как в примере выше.
Глобальные переменные
Глобальные переменные по умолчанию не доступны внутри функции. Например:
hello(); ?>
Данный код не будет работать, а интрепретатор PHP известит нас, что переменная $name не определена.
Тем не менее мы можем обратиться внутри функции к глобальной переменной. Для этого необходимо использовать ключевое слово global :
hello(); // Hello Tom ?>
Для получения доступа к глобальной переменной в функции с помощью оператора global объявляется переменная с тем же именем:
global $name;
После этого к глобальной переменной $name можно будет обращаться внутри функции. При чем мы можем не только получать ее значение, но и изменить его:
changeName(); echo $name; // Tomas ?>
В качестве альтернативы оператору global для обащения к глобальным переменным мы можем использовать встроенный массив $GLOBALS :
"; // изменяем значение переменной $name $GLOBALS["name"] = "Tomas"; > changeName(); echo "Новое имя: " . $name; ?>
Чтобы обратиться к глобальной переменной $name, применяется выражение $GLOBALS[«name»] — в квадратные скобки передается название переменной (без знака $). Результат работы скрипта:
Старое имя: Tom Новое имя: Tomas
PHP: Область видимости переменных
Область видимости переменной — это контекст, в котором эта переменная определена. Большинство переменных PHP имеет единую область видимости. Эта единая область видимости (ее еще называют глобальной областью видимости) охватывает также подключаемые файлы:
В этом примере переменная $a будет доступна также внутри включенного скрипта — main.inc .
Локальные переменные
Определение пользовательской функции задает локальную область видимости для переменной, т.е. любая используемая внутри функции переменная по умолчанию ограничена локальной областью видимости функции (доступна только внутри функции в которой она определена). Как это работает: чтобы разделить переменные используемые в общем коде и переменные в функциях, PHP предоставляет отдельное хранилище для переменных внутри каждой функции. Такое разделение пространства для хранения подразумевает, что областью видимости, то есть областью, в которой доступно значение переменной, является локальное хранилище функции.
В примере ниже наглядно демонстрируется, что переменная, объявленная за пределами функции, не изменяется внутри функции. Пока не стоит стремиться понять, как работает функция, главное, что она имеет свой уникальный набор переменных:
// Вызов функции birth(); // выводим значение переменной age echo $age; // => 30 ?>
В результате исполнения этого фрагмента будет выведено: 30.
Внутри функции birth() выполняется присваивание переменной $age значения 1, но это не таже самая переменная, что была определена в глобальной области видимости. Поэтому, когда выполняется вывод на экран значения переменной $age , выводится первоначальное значение 30. Стоит отметить, что локальные переменные создаются в момент вызова функции и удаляются после окончания работы функции.
Если вы на самом деле захотите прочитать или изменить значение глобальной переменной (так называются переменные используемые в глобальной области видимости), а не локальной внутри функции birth() , она должна быть объявлена глобальной внутри определения функции.
С этой темой смотрят:
- Глобальные переменные
- Статические переменные
- Суперглобальные переменные
Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2023 © puzzleweb.ru | razumnikum.ru
Область видимости переменной
Область видимости переменной — это контекст, в котором эта переменная определена. В большинстве случаев все переменные PHP имеют только одну область видимости. Эта единая область видимости охватывает также включаемые (include) и требуемые (require) файлы. Например:
$a = 1 ;
include ‘b.inc’ ;
?>?php
Здесь переменная $a будет доступна внутри включенного скрипта b.inc . Однако определение (тело) пользовательской функции задает локальную область видимости данной функции. Любая используемая внутри функции переменная по умолчанию ограничена локальной областью видимости функции. Например:
$a = 1 ; /* глобальная область видимости */
?php
function test ()
<
echo $a ; /* ссылка на переменную локальной области видимости */
>
Этот скрипт не сгенерирует никакого вывода, поскольку выражение echo указывает на локальную версию переменной $a , а в пределах этой области видимости ей не было присвоено значение. Возможно вы заметили, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут нечаянно изменить глобальную переменную. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри определения функции.
Ключевое слово global
Сначала пример использования global:
Пример #1 Использование global
function Sum ()
global $a , $b ;
Вышеприведенный скрипт выведет 3. После определения $a и $b внутри функции как global все ссылки на любую из этих переменных будут указывать на их глобальную версию. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться функцией.
Второй способ доступа к переменным глобальной области видимости — использование специального, определяемого PHP массива $GLOBALS . Предыдущий пример может быть переписан так:
Пример #2 Использование $GLOBALS вместо global
function Sum ()
$GLOBALS [ ‘b’ ] = $GLOBALS [ ‘a’ ] + $GLOBALS [ ‘b’ ];
>
$GLOBALS — это ассоциативный массив, ключом которого является имя, а значением — содержимое глобальной переменной. Обратите внимание, что $GLOBALS существует в любой области видимости, это объясняется тем, что $GLOBALS является суперглобальным. Ниже приведен пример, демонстрирующий возможности суперглобальных переменных:
Пример #3 Суперглобальные переменные и область видимости
function test_global ()
// Большинство предопределенных переменных не являются
// «супер», и чтобы быть доступными в локальной области
// видимости, функции требуют указания ‘global’.
global $HTTP_POST_VARS ;
?php
echo $HTTP_POST_VARS [ ‘name’ ];
// Суперглобальные переменные доступны в любой области
// видимости и не требуют указания ‘global’.
// Суперглобальные переменные доступны, начиная с PHP 4.1.0, а
// использование HTTP_POST_VARS считается устаревшим.
echo $_POST [ ‘name’ ];
>
?>
Замечание:
Использование ключевого слова global вне функции не является ошибкой. Оно может быть использовано в файле, которые включается внутрь функции.
Использование статических (static) переменных
Другой важной особенностью области видимости переменной является статическая переменная. Статическая переменная существует только в локальной области видимости функции, но не теряет своего значения, когда выполнение программы выходит из этой области видимости. Рассмотрим следующий пример:
Пример #4 Демонстрация необходимости статических переменных
function test ()
$a = 0 ;
echo $a ;
$a ++;
>
?>?php
Эта функция довольно бесполезна, поскольку при каждом вызове она устанавливает $a в 0 и выводит 0. Инкремент переменной $a ++ здесь не играет роли, так как при выходе из функции переменная $a исчезает. Чтобы написать полезную считающую функцию, которая не будет терять текущего значения счетчика, переменная $a объявляется как static:
Пример #5 Пример использования статических переменных
function test ()
static $a = 0 ;
echo $a ;
$a ++;
>
?>?php
Теперь $a будет проинициализирована только при первом вызове функции, а каждый вызов функции test() будет выводить значение $a и инкрементировать его.
Статические переменные также дают возможность работать с рекурсивными функциями. Рекурсивной является функция, вызывающая саму себя. При написании рекурсивной функции нужно быть внимательным, поскольку есть вероятность сделать рекурсию бесконечной. Вы должны убедиться, что существует адекватный способ завершения рекурсии. Следующая простая функция рекурсивно считает до 10, используя для определения момента остановки статическую переменную $count :
Пример #6 Статические переменные и рекурсивные функции
Замечание:
Статические переменные могут быть объявлены так, как показано в предыдущем примере. Попытка присвоить этим переменным значения, являющиеся результатом выражений, вызовет ошибку обработки.
Пример #7 Объявление статических переменных
function foo () static $int = 0 ; // верно
static $int = 1 + 2 ; // неверно (поскольку это выражение)
static $int = sqrt ( 121 ); // неверно (поскольку это тоже выражение)
?php
Замечание:
Статические объявления вычисляются во время компиляции скрипта.
Ссылки с глобальными (global) и статическими (static) переменными
Движок Zend Engine 1, лежащий в основе PHP 4, оперирует модификаторами переменных static и global как ссылками. Например, реальная глобальная переменная, внедренная в область видимости функции указанием ключевого слова global, в действительности создает ссылку на глобальную переменную. Это может привести к неожиданному поведению, как это показано в следующем примере:
function test_global_noref () global $obj ;
$obj = new stdclass ;
>
test_global_ref ();
var_dump ( $obj );
test_global_noref ();
var_dump ( $obj );
?>
Результат выполнения данного примера:
NULL
object(stdClass)(0) >
Аналогично ведет себя и выражение static. Ссылки не хранятся статично:
echo ‘Статический объект: ‘ ;
var_dump ( $obj );
if (!isset( $obj )) // Присвоить ссылку статической переменной
$obj = &new stdclass ;
>
$obj -> property ++;
return $obj ;
>
echo ‘Статический объект: ‘ ;
var_dump ( $obj );
if (!isset( $obj )) // Присвоить объект статической переменной
$obj = new stdclass ;
>
$obj -> property ++;
return $obj ;
>
$obj1 = get_instance_ref ();
$still_obj1 = get_instance_ref ();
echo «\n» ;
$obj2 = get_instance_noref ();
$still_obj2 = get_instance_noref ();
?>
Результат выполнения данного примера:
Статический объект: NULL
Статический объект: NULL
Статический объект: NULL
Статический объект: object(stdClass)(1) [«property»]=>
int(1)
>
Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается, когда вы вызываете функцию &get_instance_ref() во второй раз.