ФорумПрограммированиеPHP для идиотов → загадко на поллитра

загадко на поллитра

  • ЗлобныйТролль

    Сообщения: 50 Репутация: N Группа: Кто попало

    Spritz 20 января 2010 г. 4:20

    имеем:

    function x(&$b) {
    global $a;
    $a = &$b;
    }

    $a = 10;
    $b = 20;
    x($b);
    print $a; // 10


    вопрос, ПОЧЕМУ?!
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 4:30, спустя 10 минут 48 секунд

    Не знаю, почему?
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 4:42, спустя 12 минут 2 секунды

    А что по твоему ссылка ссылки? Ответ ничего. Тогда на что $a менять значение, если слева ничего?
    Спустя 21 сек.
    *справа ничего?
    Спустя 127 сек.
    не фигня
  • ЗлобныйТролль

    Сообщения: 50 Репутация: N Группа: Кто попало

    Spritz 20 января 2010 г. 4:45, спустя 2 минуты 9 секунд

    krasun, жжошь!

    Проставлю пиво первому объяснившему данную ситуацию "на пальцах".
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 4:48, спустя 3 минуты 29 секунд


    // глобальная область
    function x(&$b) { $b - ссылается на глобальную область
    global $a;

    $a = &$b; // &$b - это перезаписанная ссылка на локальную область, то есть $a - теперь ссылаеться на $b, но только для function x
    }

    $a = 10;
    $b = 20;
    x($b);
    print $a; // - ссылается на локальную область function x и откуда тогда брать значение, если локальная область function x уже не доступна,
                 // ищем в глобальной


    как-то так
    Спустя 100 сек.
    вот доказательство

    <?php

    function x(&$b)
    {
    global $a;
    $a = &$b;

    echo 'local function x: a: ' . $a; // 20
    }

    $a = 10;
    $b = 20;

    x($b);

    echo 'global a: ' . $a; //10
    ?>
  • ЗлобныйТролль

    Сообщения: 50 Репутация: N Группа: Кто попало

    Spritz 20 января 2010 г. 4:52, спустя 3 минуты 28 секунд

    krasun, но ведь $a - глобальная для x() ? нет?)
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 4:58, спустя 6 минут 43 секунды

    глобальная для x(), верно, но &$b в контексте x() - это &$b в контексте x(),
    тогда если мы сделаем $a = &$b - в x(), то $a получит ссылку на &$b, но только в контексте x(),

    а когда мы попытаемся использовать $a, после вызова функции x($b), то $a еще ссылается на контекст x(), но так как его уже нет, поиск начинается в глобальной области видимости, а в глобальной $a есть и равно 10, вот и получаем, очевидно

    Спустя 92 сек.
    я для примера привел код, который показывает, что да $a меняется, но не значение,
    $a просто указывает на $b вот и все. если сделать $a = $b, то получим тогда 20
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 4:59, спустя 56 секунд

    в этой части:
    $a = &$b;
    ты назначил $a как ссылку на объект $b, то есть теперь $a не таже самая глобальная $a, а ссылка на туже область памяти что и $b.

    $a –> 0100
    $b –> 0200

    #global $a
    $a –> 0100

    #$a = &$b

    $a –> 0200
    $b –> 0200

    и она перестала быть глобальной в момент смены ее ссылки на область памяти
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:00, спустя 44 секунды

    так как скопируется значение
  • ЗлобныйТролль

    Сообщения: 50 Репутация: N Группа: Кто попало

    Spritz 20 января 2010 г. 5:02, спустя 1 минуту 45 секунд

    но почему она перестала быть глобальной, если она задекларирована как global $a ?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:03, спустя 1 минуту 39 секунд

    function x(&$b) {
       global $a;
       var_dump($GLOBALS['a'], $GLOBALS['b']);
       $a = &$b;
       var_dump($GLOBALS['a'], $GLOBALS['b']);
    }

    и станет понятно что глобальная переменная не изменяет своего содержимого
    adw/0
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:03, спустя 5 секунд

    Потому, что посмотрите как работают ссылки.
    $a = &$b, значит, теперь, что $a указывает на $b и пофиг как она задекларирована, ее может вообще не быть, но она указывает на $b
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:04, спустя 37 секунд

    ЗлобныйТролль, потому что global $a это тоже что $a =& $GLOBALS['a']
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:04, спустя 13 секунд

    чуть-чуть изменим пример

    function x(&$b) {
    $GLOBALS['a'] = &$b;
    }

    $a = 10;
    $b = 20;
    x($b);
    print $a; // 20

    в чем разница?
    в том что global $a; это какбы аналог $a =& $GLOBALS['a']
    значит конструкция
    global $a;
    $a = &$b;
    аналогична
    $a =& $GLOBALS['a'];
    $a =& $b;
    здесь нет ничего загадочного, правда? мы всего-лишь меняем ссылку локальной переменной
    ιιlllιlllι унц-унц
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:06, спустя 1 минуту 48 секунд

    СОЗДАЕТСЯ новая $a
    Спустя 97 сек.
    тонкости php при работе с ссылками, только кажеться, что в 5.3 - function(&$var) {} так уже делать нельзя будет

Пожалуйста, авторизуйтесь, чтобы написать комментарий!