Ссылки. Область видимости в функциях.

BigWindow

Новичок
Ссылки. Область видимости в функциях.

Всем привет!

Ниже приведен пример из мануала по ссылкам:

PHP:
<?php
$var1 = "Example variable";
$var2 = "";

function global_references($use_globals)
{
    global $var1, $var2;
    if (!$use_globals) {
        $var2 =& $var1; // только локально
    } else {
        $GLOBALS["var2"] =& $var1; // глобально
    }
}

global_references(false);
echo "значение var2: '$var2'\n"; // значение var2: ''
global_references(true);
echo "значение var2: '$var2'\n"; // значение var2: 'Example variable'
?>
Собственно вопрос: почему вариант $var2 =& $var1 не работает?

Как было сказано в мануале "Думайте о global $var; как о сокращении от $var =& $GLOBALS['var'];. Таким образом, присвоение $var другой ссылки влияет лишь на локальную переменную.".

Исходя из этого, переменная $var2 принимает ссылку на те же данные, что и указывает $GLOBALS['var2'].

Не понятна данная ситуация. Может кто пояснит?
 

Андрейка

Senior pomidor developer
BigWindow
прочитай СЛЕДУЮЩУЮ страницу мануала.. неужели осилить сразу все 7 страниц так тяжело?
 

BigWindow

Новичок
Автор оригинала: Андрейка
BigWindow
прочитай СЛЕДУЮЩУЮ страницу мануала.. неужели осилить сразу все 7 страниц так тяжело?
Следующая страница:

PHP:
<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar); 
?>
Здесь все понятно: в функцию передается ссылка на $bar. Затем эта ссылка заменяется на ссылку $GLOBALS["baz"].

И что это дает? Честно говоря не понимаю механизма.
 

Андрейка

Senior pomidor developer
а что тебе собстно непонятно в 1 сообщении? то, что непонятна "ситуация" я понял, но вот конкретики немножко нехватает)
 

berkut

Новичок
PHP:
function global_references($use_globals) 
{ 
    global $var1, $var2; /* Это тупо эквивалент:
    $var1 =& $GLOBALS['var1']; - что это? это тупо создаётся ЛОКАЛЬНАЯ переменная, и ей присваивается ССЫЛКА на глобалс
    $var2 =& $GLOBALS['var2'];
    */
    if (!$use_globals) { 
        $var2 =& $var1; // здесь, ЛОКАЛЬНОЙ переменной $var2 присваивается ссылка на $GLOBALS['var1'];
    } 
    else { 
        $GLOBALS["var2"] =& $var1; // глобально 
    }
    // по выходу из функции, типо unset($var1, $var2);
    // главное, что $var1 & $var2 - это ЛОКАЛЬНЫЕ переменные, ссылающиеся на глобальные. 
    //При unset() переменной, содержащей ссылку, исходная переменная не уничтожается, о чём написано в мане
}
 

BigWindow

Новичок
Автор оригинала: Андрейка
а что тебе собстно непонятно в 1 сообщении? то, что непонятна "ситуация" я понял, но вот конкретики немножко нехватает)
Ок! Сейчас распишу что не ясно:

global $var1, $var2; - вся понятно. Выражение в духе $var =& $GLOBALS['var'];

То есть, в $var1 в функции хранится ссылка на $var1-глобальную переменную.

А вот это выражение не ясно:
$var2 =& $var1;

Тут мы передаем ссылки из одной переменной в другую. Так почему же не передается? :)

Может я плохо выражаю свои мысли :) Просто когда я не понимаю, то и изложить свои мысли мне очень сложно :(
 

berkut

Новичок
главная фича - это, что global $var1, $var2; - создаёт локальные переменные. и попутно впихивает в них ссылки на глобальные.
 

Андрейка

Senior pomidor developer
в дополнение к вышенаписанному
PHP:
$a = 100;
$d = 200;
$b = &$a;
$c = &$d;
var_dump($a, $b, $c, $d);
$a = &$c; // теперь $а указывает на то же место, что и $c и $d
// $b, которая была $b = &$a, все также указывает на то же место с 100, куда раньше указывала и $a
var_dump($a, $b, $c, $d);
 

BigWindow

Новичок
berkut, большое спасибо! Теперь все встало на свои места!

Андрейка - ваш пример ответил на все вопросы! Большое спасибо! Таких примеров я не встречал в мануалах ;)

-~{}~ 10.02.08 18:00:

В дополнение хотел бы спросить, есть ли материалы по внутрнней работе Zend Engine? Хотелось бы плотнее познакомиться с недрами PHP :)
 
Сверху