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