- локальные, глобальные,статические, параметры функций

Печать: Шрифт: Абв Абв Абв
admin 26 Февраля 2006 в 19:56:55
Переменные

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

Объявление переменных

Переменная представляет собой именованную область памяти, содержащую данные, с которыми можно выполнять операции во время выполнения программы.

Имена переменных всегда начинаются со знака доллара, $. Ниже приведены примеры допустимых имен переменных:
<?
$со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. <br>";
    }
    assignx();
    print
    "$x outside of function is $x. <br>";
    ?>


    При выполнении этого фрагмента выводится следующий результат:

    Quote:
    $х 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
    "<br>";
    }
    keep_track();
    keep_track();
    keep_track();
    ?>

    Как будут выглядеть результаты работы этого сценария? Если бы переменная $count не была объявлена статической (то есть являлась локальной), результат выглядел бы так:

    Quote:
    1
    1
    1


    Но поскольку переменная $count является статической, при каждом вызове функции будет сохраняться ее предыдущее значение, поэтому результат будет таким:

    Quote:
    1
    2
    3


    Статические переменные особенно удобны при написании рекурсивных функций — особого класса функций, которые многократно вызывают сами себя до выполнения некоторого условия. Рекурсивные функции рассматриваются в главе 4.

    Комментарии, по рейтингу, по дате
      Гость 31.01.2008 в 08:12:46   # 1317
    Добавить сообщение
    Чтобы добавлять комментарии зарeгиcтрирyйтeсь