[php] Суперглобальные переменные переменных

Discussion in 'PHP' started by |qbz|, 6 Nov 2012.

  1. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    PHP:
    <?php

        define
    ('X''GLOBALS');
        
        
    var_dump(${X}); // $GLOBALS
        
        
    function a()
        {
            
    var_dump(${X});
        }
        
    a(); // NULL
        
        
    $x create_function('''var_dump(${X});');
        
    $x(); // NULL
        
    ?>
    Почему NULL?
     
  2. AnGeI

    AnGeI Elder - Старейшина

    Joined:
    8 Dec 2008
    Messages:
    395
    Likes Received:
    79
    Reputations:
    16
    Warning​

    Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
     
    1 person likes this.
  3. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Спасибо, маэстро. Только вот почему ${'GLOBALS'} проходит? И почему define('X', 'GLOBALS'); ${X} не проходит..?
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Фича языка такая, принимай как данность.
     
    _________________________
  5. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Смотри, ВНЕ функции у нас работает как вариант

    var_dump(${'GLOBALS'});

    так и

    var_dump(${X});

    Внутри функции работает только вариант

    var_dump(${'GLOBALS'});

    То есть логично предположить что дело в константе, что она каким-то образом не читается / теряется. Проверяем:

    function a(){echo X;}

    Константа на месте! Тогда какого хрена, PHP?
     
  6. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196
    потому что ${X} не глобальная переменная и чтобы использовать ее в функции, ее нужно глобализовать.


    PHP:
    <?php 

        define
    ('X''GLOBALS'); 
         
        
    var_dump(${X}); // $GLOBALS 
         
        
    function a() 
        { 
           global ${
    X};
            
    var_dump(${X}); 
        } 
        
    a(); // NULL 
         
        
    $x create_function('''var_dump(${X});'); 
        
    $x(); // NULL 
         
    ?> 

    http://php.net/manual/ru/language.variables.scope.php
     
    #6 попугай, 7 Nov 2012
    Last edited: 7 Nov 2012
  7. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    $GLOBALS это суперглобальный массив. Она из любого места видна.
     
  8. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196
    $GLOBALS это суперглобальный массив, да. А создаваемая тобой переменная ${X} это обычная переменная.
     
  9. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    ${X} == ${'GLOBALS'} == $GLOBALS
     
  10. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196
    нет, ты просто присваиваешь переменной значение $GLOBALS
     
  11. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    o_O

    И как эта переменная называется? Той которой присваиваю то есть.
     
  12. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196

    Этого точно не скажу. Но ${X} это переменная и ведет она себя как переменная.
     
  13. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Ну дак $GLOBALS тоже переменная. Да нет, мен, здесь не в видимости дело.
     
  14. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196
    100% в видимости. Фишка в том, что ты выводишь не непосредственно $GLOBALS, а именно новую переменную ${X}. То же самое если ты сделаешь так.


    PHP:
    $aaa 'aaaaaaaa';
     
    define('X''aaa'); 
         
        
    var_dump(${X}); 
         
        function 
    a() 
        { 
            
    var_dump(${X}); 
        } 
        
    a(); 
    а потом

    PHP:
    $aaa 'aaaaaaaa';
     
    define('X''aaa'); 
         
        
    var_dump(${X}); 
         
        function 
    a() 
        { 
    global ${
    X};
            
    var_dump(${X}); 
        } 
        
    a(); 
     
    1 person likes this.
  15. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Константы видимы отовсюду. Это раз. $GLOBALS виден тоже отовсюду, это два. Тогда вопрос - зачем нужно юзать global?
     
  16. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,519
    Likes Received:
    401
    Reputations:
    196
    Читай мой пост выше.
     
  17. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    Читай мой пост выше.
     
  18. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    В чем смысл темы? Если считаете, что это баг - вперед на php.net репортить, именно так писать не выходит, альтернативные варианты приводились в теме. Так чего ждем? Указания на конкретную строку в исходниках пхп, которая препятствует такому финту?
     
    _________________________
  19. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    А ты че, тут самый крутой?


















    :D шутка
     
  20. khvdaiver

    khvdaiver New Member

    Joined:
    29 Oct 2012
    Messages:
    79
    Likes Received:
    2
    Reputations:
    0
    я думаю, всё кроется в конструкции ${'VAR'}, вызванной изнутри функции. Как-то тут неясно области видимости работают. Почитайте об этом.