главная :: основы PHP
Переменные
В примерах, приведенных выше, я попутно показал, как происходит присваивание и изменение значений переменных. И все же стоит четко
сформулировать правила объявления переменных и выполнения операций с ними. Ниже приводится подробное описание этих правил.
Объявление переменных
Переменная представляет собой именованную область памяти, содержащую данные, с которыми можно выполнять операции во время
выполнения программы.
Имена переменных всегда начинаются со знака доллара, $. Ниже приведены примеры допустимых имен переменных:
$соlоr
$operating_system
$_some_variable
$model
Имена переменных должны соответствовать тем же условиям, что и идентификаторы. Другими словами, имя переменной начинается с буквы
или символа подчеркивания и состоит из букв, символов подчеркивания, цифр или других ASCII-символов в интервале от 127 до 255.
Следует заметить, что переменные в РНР, как и в языке Perl, не требуют специального объявления. Вместо этого переменная объявляется при
первом ее использовании в программе. Более того, тип переменной косвенно определяется по типу хранящихся в ней данных. Рассмотрим
следующий пример:
$sentence = "This is a sentence."; // $sentence интерпретируется как строка
$price = 42.99: // $price интерпретируется как вещественное число
$weight = 185; // $weight интерпретируется как целое число
Переменные могут объявляться в любой точке сценария РНР, однако от расположения объявления зависит то, откуда можно обращаться к
данной переменной.
Область видимости переменных
Область видимости (scope) определяется как область доступности переменной в той программе, в которой она была объявлена. В
зависимости от области видимости переменные РНР делятся на четыре типа:
локальные переменные;
параметры функций;
глобальные переменные;
статические переменные.
Локальные переменные
Переменная, объявленная внутри функции, считается локальной; другими словами, на нее можно ссылаться только в этой функции. При любом
присваивании вне функции будет использоваться совершенно другая переменная, которая не имеет ничего общего (кроме имени) с
переменной, объявленной внутри функции. При выходе из функции, в которой была объявлена локальная переменная, эта переменная и ее
значение уничтожаются.
Основное достоинство локальных переменных — отсутствие непредвиденных побочных эффектов, связанных со случайной или намеренной
модификацией глобальной переменной. Рассмотрим следующий пример:
$х = 4;
function assignx () {
$х = 0;
print "\$x inside function is $x. ";
}
assignx();
print "\$x outside of function is $x. ";
При выполнении этого фрагмента выводится следующий результат:
$х inside function is 0.
$х outside of function is 4.
Как видите, программа выводит два разных значения переменной $х. Дело в том, что переменная $х внутри функции assignx имеет локальную
природу, и изменение ее значения никак не отражается на значении, существующем за пределами этой функции. Справедливо и обратное —
модификация $х за пределами функции никак не отражается на локальных переменных функции assignx().
Параметры функций
В РНР, как и во многих других языках программирования, любые параметры, передаваемые функции при вызове, должны быть объявлены в
заголовке функции. Хотя параметрам присваиваются аргументы, переданные извне, после выхода из функции они становятся недоступными.
Параметры объявляются в круглых скобках после имени функции. Объявление параметров практически не отличается от объявления
типичной переменной:
// Функция умножает переданное значение на 10 и возвращает результат
function x10 ($value) {
$value = $value * 10;
return $value;
}
Хотя вы можете обращаться к параметрам в той функции, в которой они были объявлены, и выполнять с ними необходимые операции, после
завершения функции параметры уничтожаются.
Глобальные переменные
Глобальные переменные, в отличие от локальных, доступны в любой точке программы. Но чтобы изменить значение глобальной переменной,
необходимо специально объявить ее как глобальную в соответствующей функции. Для этого перед именем переменной ставится ключевое
слово GLOBAL. Пример:
$somevar = 15;
function addit() {
GLOBAL $somevar;
$somevar++;
print "Somevar is $somevar";
}
addit();
Будет выведено значение $somevar, равное 16. Допустим, вы забыли включить следующую строку:
GLOBAL $somevar;
В этом случае $somevar будет присвоено значение 1, поскольку эта переменная будет считаться локальной по отношению к функции addit( ).
Локальная переменная по умолчанию инициализируется 0, а затем к ней прибавляется 1; таким образом, будет выведено значение 1.
Альтернативный способ объявления глобальных переменных связан с использованием массива РНР $GLOBALS( ). Давайте вернемся к
предыдущему примеру и воспользуемся этим массивом для объявления глобальной переменной $somevar: $somevar = 15;
function addit() {
$GLOBALS["somevar"];
$somevar++;
}
addit();
print "Somevar is $somevar";
Каким бы способом ни обеспечивалась глобальная видимость переменной, помните, что неосторожное использование глобальных
переменных нередко приводит к неожиданным результатам, причиняющим немало хлопот программистам. Таким образом, хотя глобальные
переменные очень удобны, при их использовании необходима умеренность.
Статические переменные
Последний тип видимости переменных называется статическим. В отличие от переменных, объявленных параметрами и уничтожаемых при
выходе из функции, статическая переменная сохраняет свое значение при повторном вызове. Для объявления статической переменной перед
ее именем ставится ключевое слово STATIC:
STATIC $somevar;
Рассмотрим пример:
function keep_track() {
STATIC $count = 0;
$count++;
print $count;
print " ";
}
keep_track();
keep_track();
keep_track();
Как будут выглядеть результаты работы этого сценария? Если бы переменная $count не была объявлена статической (то есть являлась
локальной), результат выглядел бы так:
1
1
1
Но поскольку переменная $count является статической, при каждом вызове функции будет сохраняться ее предыдущее значение, поэтому
результат будет таким:
1
2
3
Статические переменные особенно удобны при написании рекурсивных функций — особого класса функций, которые многократно вызывают
сами себя до выполнения некоторого условия. Рекурсивные функции рассматриваются в главе 4.
|