Как объявить глобальную переменную в php?

168

У меня есть код что-то вроде этого:

<?
    $a="localhost";
    function body(){
        global $a;
        echo $a;
    }

    function head(){
        global $a;
        echo $a;
    }

    function footer(){
        global $a;
        echo $a;
    }
?>

Есть ли способ определить глобальную переменную в одном месте и сделать переменную $aдоступной во всех функциях одновременно? не используя global $a;больше?

СВЕТ
источник
15
Нет, нет Если вам не нравится globalключевое слово, рассмотрите возможность использования $GLOBALS['a']суперглобала во всех областях или передайте параметр своим функциям.
Майкл Берковски
5
Если это что-то важное, то можно использовать даже сеансовую переменную.
Никос Циракис

Ответы:

259

$GLOBALSМассив может быть использован вместо:

$GLOBALS['a'] = 'localhost';

function body(){

    echo $GLOBALS['a'];
}

Из руководства :

Ассоциативный массив, содержащий ссылки на все переменные, которые в настоящее время определены в глобальной области действия сценария. Имена переменных являются ключами массива.


Если у вас есть набор функций, которым нужны некоторые общие переменные, класс со свойствами может быть хорошим выбором вместо глобального:

class MyTest
{
    protected $a;

    public function __construct($a)
    {
        $this->a = $a;
    }

    public function head()
    {
        echo $this->a;
    }

    public function footer()
    {
        echo $this->a;
    }
}

$a = 'localhost';
$obj = new MyTest($a);
MrCode
источник
78

Если переменная не изменится, вы можете использовать define

Пример:

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!');

function footer()
{
    echo FOOTER_CONTENT;
}
Дол
источник
2
Что происходит, когда FOOTER_CONTENTпытаются изменить? Это так же, как finalв Java или constв C, C ++ и C #?
Лев
4
Если вы попытаетесь определить FOOTER_CONTENT во второй раз, php выдаст уведомление об этом
Dale
Мне нужно было вычислять текущее время эпохи Unix при каждой загрузке страницы, а затем использовать это значение в паре вычислений (функций). «определить» работал для меня. Первоначально я не видел этого "echo FOOTER_CONTENT;" у меня не было предыдущего символа $, и я получил ошибки.
user208145
Если переменная не собирается менять, она не является переменной. Не так ли ?!
Саджидур Рахман
29

Добавьте ваши переменные в суперглобальный массив $ GLOBALS, например:

$GLOBALS['variable'] = 'localhost'; 

и использовать его во всем мире

или вы можете использовать константу, которая доступна по всему сценарию

define('HOSTNAME', 'localhost');  
Панкай Хайрнар
источник
1
Если вы используете 'define', после установки вы не сможете изменить определение!
Реза М.А.
в вашем первом примере говорится, что переменная $ теперь называется localhost позже в скрипте?
Зак Смит
нет, если вы хотите использовать эту переменную, вы должны использовать ее как $ GLOBALS ['variable'];
Панкадж Хайрнар
25

Если переменная объявлена ​​вне функции, она уже находится в глобальной области видимости. Так что нет необходимости декларировать. Но откуда вы вызываете эту переменную, вы должны иметь доступ к этой переменной. Если вы звоните изнутри функции, вы должны использовать globalключевое слово:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Использование глобального ключевого слова вне функции не является ошибкой. Если вы хотите включить этот файл в функцию, вы можете объявить переменную как global.

config.php

global $variable;

$variable = 5;

other.php

function name()
{
    require_once __DIR__ . '/config.php';
}

Вы также можете использовать $GLOBALS. Это суперглобальный, поэтому он имеет доступ везде.

$GLOBALS['variable'] = 5;

function name()
{
    echo $GLOBALS['variable'];
}

В зависимости от вашего выбора вы можете выбрать любой.

Саджидур Рахман
источник
9

Этот ответ очень поздно, но я делаю, чтобы установить класс, который содержит логические значения, массивы и целочисленные начальные значения в качестве статических переменных глобальной области видимости. Любые постоянные строки определяются как таковые.

define("myconstant", "value"); 

class globalVars {

    static $a = false;

    static $b = 0;

    static $c = array('first' => 2, 'second' => 5);

}


function test($num) {

    if (!globalVars::$a) {

        $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.';

        globalVars::$a = true;

    } else {

        $returnVal = 'I forgot';

    }

    return $returnVal;

}

echo test(9); ---> The value of 9 + 0 + 5 is 14.

echo "<br>";

echo globalVars::$a; ----> 1

В staticключевых словах должны присутствовать в классе иначе вары $ а, $ Ь и $ с не будет глобальная область.

Единственный Химический Блоб
источник
Это хорошее решение по многим причинам. Классу static требуется всего несколько символов, добавленных к базовому имени переменной: G :: $ Name, где объявление выглядит следующим образом: class G {static $ Name, $ Name2;} Обратите внимание, что G может быть действительно глобальными переменными, тогда E может использоваться для переменных, относящихся к Сотрудникам. Это проще для программирования, чем полномасштабная объектно-ориентированная парадигма, поддерживаемая PHP. Если константы действительно необходимы, вы можете объявить их после «const», точно так же, как переменные, объявленные после «static» - просто пропустите знаки доллара. G :: Example будет примером глобальной константы.
Дэвид Спектор
5

Вы ответили на это так, как написали вопрос - используйте «определить». но после установки вы не можете изменить определение.

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

Робби
источник
5

Вы можете попробовать ключевое слово useв функциях Closure или Lambdas, если это соответствует вашим намерениям ... Хотя PHP 7.0. Не лучше, а просто альтернатива.

$foo = "New";
$closure = (function($bar) use ($foo) {
    echo "$foo $bar";
})("York");

демо | Информация

Thielicious
источник
1

Давайте подумаем немного по-другому:

class globe{
    static $foo = "bar";
}

И вы можете использовать и изменять его так, как вам нравится, например:

function func(){
    echo globe::$foo;
}
Амир Фо
источник
0

Что делать, если вы используете процедурную функцию вместо переменной и вызываете их где угодно, как вы.

Я обычно делаю коллекцию значений конфигурации и помещаю их в функцию с оператором return. Я просто включаю это, где мне нужно использовать глобальное значение и вызывать определенную функцию.

function host()
{
   return "localhost";
}
Вешрадж Джоши
источник
-1

$GLOBALS[] это правильное решение, но поскольку мы говорим об альтернативах, функция также может легко выполнить эту работу:

function capital() {
    return my_var() . ' is the capital of Italy';
}

function my_var() {
    return 'Rome';
}
Дарио Феррер
источник
Здесь функция не является глобальной переменной.
Пратик Сони
-19

Вам больше не следует использовать глобальные переменные, они недоступны в PHP 5.4.

Дэниэл Вест
источник
19
РЕГИСТРАЦИЯ ГЛОБАЛОВ удалена. не глобальные.
unity100
7
Этот ответ, как написано, является неправильным и должен быть обновлен, чтобы отразить комментарий unity100. Если GLOBALS все еще доступны, пожалуйста, уточните, какие аспекты GLOBAL изменились. Что-то вроде этого.
аварийный своп
@robinCTS meta.stackoverflow.com/questions/317559/…
Роберт Колумбия
@RobertColumbia Очень интересный пост, и я буду помнить о других ответах, но он не применим в данном конкретном случае. (Я надеюсь, что вы просто используете эту мету, чтобы указать, как ответ «не делай этого» может быть действительным, а не как оправдание того, что этот ответ есть;)) «Не делай этого» может быть правильным ответом . "-„может быть“не„является“. « Но иногда ничего не нужно делать вместо этого. Если вы просто перестанете делать что-то неправильное, все снова волшебным образом начнет работать ». - Здесь не применимо, поскольку код не «сломан». ОП просто хочет «меньше набирать» способ ведения дел. …
robinCTS
« Это на самом деле пытается ответить на вопрос? В большинстве случаев, это так. » - «Большинство», а не «все». (Я бы даже оспаривал «большинство», но я не видел достаточно таких ответов, чтобы дать обоснованный аргумент.). « В данном случае это не так». И в этом «ответе» это не так, по тем же причинам: « Хуже того, ответ Мерфи не предлагает решения проблемы » и « Он не дает». спрашивающий инструмент или метод, или что-либо вообще напоминающее решение его проблемы ". …
robinCTS