Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
модуль пхп.doc
Скачиваний:
7
Добавлен:
29.08.2019
Размер:
713.22 Кб
Скачать

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

Очень важная характеристика переменной - её область видимости (область действия), т.е. описание того, из каких мест программы (скрипта) можно прочитать или изменить её значение. Следует всегда помнить, что переменная, объявленная внутри блока программы, видна только в пределах этого блока, а для того, чтобы обратиться к переменной, объявленной снаружи блока, необходимо её особым образом объявить.

Блоками программы в данном случае являются "скрипт", "функция" или "класс". Например:

<php

$name = 'Вася';

// переменная $name объявлена в блоке "скрипт"

// функция, добавляющая фамилию к имени

function tryChengeName($family)

{

$fullName = $name . $family;

echo 'Имя внутри функции: '.$fullName;

}

echo 'Имя ДО вызова функции: '.$name;

// результат: "Имя ДО вызова функции: Вася"

tryChengeName(' Иванов');

// результат: ""

echo 'Имя ПОСЛЕ вызова функции: '.$name;

// результат: "Имя ПОСЛЕ вызова функции: Вася"

?>

Вроде бы всё правильно, но - не работает. Почему? Потому что если явно не сказать, что переменная $name внутри функции - это в действительности глобальная переменная $name, то интерпретатор создать временную копию переменной с именем $name и пустым значением. А так как значение пустое (неопределённое), то и результат сложения строк будет неопределён (пуст).

Исправить положение очень легко, достаточно добавить всего одну строку (выделена жирным шрифтом):

<php

$name = 'Вася';

// переменная $name объявлена в блоке "скрипт"

// функция, добавляющая фамилию к имени

function tryChengeName($family)

{

global $name;

// явно указываем, что надо

// использовать глобальную переменную.

$fullName = $name . $family;

echo 'Имя внутри функции: '.$fullName;

}

echo 'Имя ДО вызова функции: '.$name;

// результат: "Имя ДО вызова функции: Вася"

tryChengeName(' Иванов');

// результат: "Имя внутри функции: Вася Иванов"

echo 'Имя ПОСЛЕ вызова функции: '.$name;

// результат: "Имя ПОСЛЕ вызова функции: Вася Иванов"

?>

В данном примере переменная $name имеет область видимости, равную всему скрипту, а переменная $fullName, объявленная внутри функции, имеет область определения равную этой самой функции. Это значит, при выходе их функции переменная $fullName будет уничтожена, а все попытки прочитать её значение приведут к ошибке.

Примеры работы с классами мы рассмотрим в разделе "Классы и наследование".

Переменные переменные

Да-да, здесь нет ошибки, именно так (двумя словами) называются некоторые переменные в PHP. Смысл в том, что текстовая часть имени переменной (т.е. имя без знака доллара) может сама быть именем. Например:

<php

// объявляем и инициализируем

// переменную $varVar

$varVar = 'Вася';

// объявляем и инициализируем

// переменную $$varVar, т.е. $Вася

$$varVar = 'Иванов';

echo "$varVar ${$varVar}";

// выведет Вася Иванов,

?>

Настоятельно не рекомендуется пользоваться подобными приёмами без острой необходимости. Код, напичканый такими трюками, очень сложно сопровождать. Особенно это важно при работе с данными, вводимыми пользователями. Главная причина сложностей - неявные зависимости. Например, что случится, если вместо имени 'Вася' написать что-то вроде "''""_;%//^q'"? Правильно! Скрипт в большинстве случаев не сможет выполниться! Можно, конечно, добавить кучу проверок на наличие "неправильных" символов, но проще вообще не пользоваться такими трюками.