Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мова РНР.Питання до заліку.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Ссылки с глобальными (global) и статическими (static) переменными

Движок Zend 1, лежащий в основе PHP 4, оперирует модификаторами переменных static и global как ссылками. Например, реальная глобальная переменная, внедренная в область видимости функции указанием ключевого слова global, в действительности создает ссылку на глобальную переменную. Это может привести к неожиданному поведению, как это показано в следующем примере:

<?php function test_global_ref() {     global $obj;     $obj = &new stdclass; } function test_global_noref() {     global $obj;     $obj = new stdclass; } test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj); ?>

Результат выполнения данного примера:

NULL object(stdClass)(0) { }

Аналогично ведет себя и выражение static. Ссылки не хранятся статично:

<?php function &get_instance_ref() {     static $obj;     echo 'Статический объект: ';     var_dump($obj);     if (!isset($obj)) {         // Присвоить ссылку статической переменной         $obj = &new stdclass;     }     $obj->property++;     return $obj; } function &get_instance_noref() {     static $obj;     echo 'Статический объект: ';     var_dump($obj);     if (!isset($obj)) {         // Присвоить объект статической переменной         $obj = new stdclass;     }     $obj->property++;     return $obj; } $obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "\n"; $obj2 = get_instance_noref(); $still_obj2 = get_instance_noref(); ?>

Результат выполнения данного примера:

Статический объект: NULL Статический объект: NULL Статический объект: NULL Статический объект: object(stdClass)(1) { ["property"]=> int(1) }

Этот пример демонстрирует, что при присвоении ссылки статической переменной она не запоминается, когда вы вызываете функцию &get_instance_ref() во второй раз.

Предопределенные переменные

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

Переменные

PHP Manual

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

Иногда бывает удобно иметь переменными имена переменных. То есть, имя переменной, которое может быть определено и изменено динамически. Обычная переменная определяется примерно таким выражением:

<?php $a = 'hello'; ?>

Переменная переменной берет значение переменной и рассматривает его как имя переменной. В вышеприведенном примере hello может быть использовано как имя переменной при помощи двух знаков доллара. То есть:

<?php $$a = 'world'; ?>

Теперь в дереве символов PHP определены и содержатся две переменные: $a, содержащая "hello", и $hello, содержащая "world". Таким образом, выражение

<?php echo "$a ${$a}"; ?>

выведет то же, что и

<?php echo "$a $hello"; ?>

то есть, они оба выведут: hello world.

Для того чтобы использовать переменные переменных с массивами, вы должны решить проблему двусмысленности. То есть, если вы напишете $$a[1], обработчику необходимо знать, хотите ли вы использовать $a[1] в качестве переменной, либо вам нужна как переменная $$a, а затем ее индекс [1]. Синтаксис для разрешения этой двусмысленности таков: ${$a[1]} для первого случая и ${$a}[1] для второго.

К свойствам класса также можно получить доступ динамически. Переменное имя свойства будет разрешено в том контексте, в котором произойдет вызов к нему. Например, в случае выражения $foo->$bar, локальная область видимости будет просканирована на наличие переменной $bar, значение которой будет использовано в качестве имени свойства объекта $foo. Это также работает и в том случае, если $bar осуществляет доступ к элементу массива.

Пример #1 Пример переменной функции

<?php class foo {     var $bar = 'I am bar.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo $foo->$bar . "\n"; echo $foo->$baz[1] . "\n"; ?>

Результат выполнения данного примера:

I am bar. I am bar.

Внимание

Пожалуйста, обратите внимание, что переменные переменных не могут использоваться с Суперглобальными массивами PHP. Переменная $this также является особой, на нее нельзя ссылаться динамически.

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

Переменные извне PHP

Переменные

PHP Manual