При использовании переменных и функций следует учитывать области видимости переменных. Область видимости задает область действия, доступности данной переменной.
Блоки циклов и условных конструкций не образуют отдельной области видимости, и переменные, определенные в этих блоках, мы можем использовать вне этих блоков:
$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
Локальные переменные создаются внутри функции. К таким переменным можно обратиться только изнутри данной функции. Например:
<?php function showName(){ $name = "Tom"; echo $name; } showName(); echo $name; // так написать нельзя, так как // переменная $name существует // только внутри функции showName( ?>
В данном случае в функции showName()
определена локальная переменная $name
. Соответственно обратиться в этой переменной
мы можем только внутри функции showName()
, но не вне ее.
То же самое относится и к параметрам функции: вне функции ее параметры также не существуют.
На локальные переменные похожи статические. Они отличаются тем, что после завершения работы функции их значение сохраняется. При каждом новом вызове функция использует ранее сохраненное значение. Например:
<?php function getCounter() { static $counter = 0; $counter++; echo $counter; } getCounter(); // counter=1 getCounter(); // counter=2 getCounter(); // counter=3 ?>
Чтобы указать, что переменная будет статической, к ней добавляется ключевое слово static. При трех последовательных вызовах функции
getCounter()
переменная $counter будет увеличиваться на единицу.
Если бы переменная $counter была обычной нестатической, то при каждом вызове функция getCounter() выводила бы 1.
Как правило, статические переменные служат для создания различных счетчиков, как в примере выше.
Глобальные переменные по умолчанию не доступны внутри функции. Например:
<?php $name = "Tom"; function hello() { echo "Hello " . $name; } hello(); ?>
Данный код не будет работать, а интрепретатор PHP известит нас, что переменная $name
не определена.
Тем не менее мы можем обратиться внутри функции к глобальной переменной. Для этого необходимо использовать ключевое слово global:
<?php $name = "Tom"; function hello() { global $name; echo "Hello " . $name; } hello(); // Hello Tom ?>
Для получения доступа к глобальной переменной в функции с помощью оператора global объявляется переменная с тем же именем:
global $name;
После этого к глобальной переменной $name можно будет обращаться внутри функции. При чем мы можем не только получать ее значение, но и изменить его:
<?php $name = "Tom"; function changeName() { global $name; $name = "Tomas"; } changeName(); echo $name; // Tomas ?>
В качестве альтернативы оператору global для обащения к глобальным переменным мы можем использовать встроенный массив $GLOBALS:
<?php $name = "Tom"; function changeName() { $username = $GLOBALS["name"]; echo "Старое имя: $username <br>"; // изменяем значение переменной $name $GLOBALS["name"] = "Tomas"; } changeName(); echo "Новое имя: " . $name; ?>
Чтобы обратиться к глобальной переменной $name, применяется выражение $GLOBALS["name"]
- в квадратные скобки передается
название переменной (без знака $). Результат работы скрипта:
Старое имя: Tom Новое имя: Tomas