Являются ли переменные вне функций своего рода глобальными переменными? - PullRequest
6 голосов
/ 05 июня 2011
<?php

$foo = 1;

function meh(){
  // <-- $foo can't be accessed
}

Это не похоже на глобал, но имеет ли тот факт, что переменная снаружи, имеет какие-то недостатки, такие как глобальные вещи?

Ответы [ 6 ]

7 голосов
/ 05 июня 2011

Все переменные, определенные вне любой функции, объявляются в глобальной области видимости.Если вы хотите получить доступ к глобальной переменной, у вас есть два варианта:

  1. Используйте ключевое слово global

    <?php
    $a = 1;
    $b = 2;
    
    function Sum()
    {
        global $a, $b;
    
        $b = $a + $b;
    }
    ?> 
    
  2. Или используйте $ GLOBALS

    <?php
    $a = 1;
    $b = 2;
    
    function Sum()
    {
        $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
    } 
    ?>
    

    Подробнее на http://php.net/manual/en/language.variables.scope.php

7 голосов
/ 05 июня 2011

Да. К ним можно получить доступ из любого места, включая другие скрипты.Они немного лучше, поскольку вам нужно использовать ключевое слово global для доступа к ним из функции, что дает больше ясности относительно того, откуда они приходят и что они делают. Применяются недостатки глобальных переменных, , но это не сразу делает их злыми, как это часто воспринимается в некоторых языках ОО.Если они дают хорошее и эффективное решение, которое легко понять, то у вас все в порядке.Буквально миллионы успешных PHP-проектов используют глобальные переменные, объявленные так.Самая большая ошибка, которую вы можете сделать, это не использовать их и сделать ваш код еще более сложным, когда было бы идеально использовать их в первую очередь.: D

5 голосов
/ 05 июня 2011
<?php

$foo = 1;

function meh(){
  global $foo;
  // <-- $foo now can be accessed
}

?>
2 голосов
/ 05 июня 2011

Если я правильно понимаю ваш вопрос, проблем не должно быть. Если вы не объявите переменную как глобальную, она будет ограничена областью, в которой она объявлена, в этом случае в любом php-файле, в котором определен вышеуказанный код. Вы можете объявить другую переменную $ foo в meh (), и это будет не зависит от $ foo, определенного снаружи.

2 голосов
/ 05 июня 2011

В вашем примере $foo создается как переменная в глобальной области видимости.(Если ваш показанный скрипт не был included() из другой области функций / методов.)

PHP не имеет реальных глобальных переменных.Чтобы получить к ним доступ, вам нужно вручную создать псевдоним с помощью оператора global $foo;.(Кроме того, «что-то глобальное - это плохо» - это просто плохой совет.)

2 голосов
/ 05 июня 2011

Снаружи функция похожа на глобальную область видимости (по сравнению с С-подобными языками), но вам нужно сделать одну вещь, чтобы разрешить доступ к переменной внутри функции:

function meh(){
  global $foo;
  // $foo now exists in this scope
}
...