Як оголосити глобальну змінну в 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
Якщо це щось важливе, тоді навіть сеанс var можна використовувати.
Нікос Циракіс

Відповіді:


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);

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 кине сповіщення про це
Дейл

Мені потрібно було обчислити поточний час Unix епохи кожного разу при завантаженні сторінки, а потім використовувати це значення в парі обчислень (функцій). "визначити" працював для мене. Спочатку я не бачив цього "відлуння FOOTER_CONTENT;" не було попереднього "$", і я отримав помилки.
користувач208145

Якщо змінна не збирається змінювати її, це не змінна. Чи не так ?!
Саджидур Рахман

29

Додайте свої змінні в супер глобальний масив $ GLOBALS, як

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

і використовувати його в усьому світі

або ви можете використовувати константу, доступну в усьому сценарії

define('HOSTNAME', 'localhost');  

1
Якщо ви використовуєте "визначити", встановивши, ви не можете змінити визначення!
Реза МА

у вашому першому прикладі йдеться про те, що змінна '$ тепер пізніше в сценарії називається' localhost '?
Зак Сміт

ні, якщо ви хочете використовувати цю змінну, ви повинні використовувати її як $ GLOBALS ['змінна'];
Панкай Хайнар

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ключових словах повинні бути присутніми в класі інакше вари $ а, $ Ь і $ з не буде глобальна область.


Це хороше рішення з багатьох причин. До статичного класу потрібно лише кілька символів, доданих до основного імені змінної: G :: $ Name, де декларація виглядає приблизно так: клас G {static $ Name, $ Name2;} Зверніть увагу, що G може бути справді глобальними змінними, тоді E міг би використовувати для змінних, що стосуються працівників. Це легше програмувати, ніж повномасштабна об'єктно-орієнтована парадигма, що підтримується PHP. Якщо константи справді потрібні, ви можете оголосити їх після "const" так само, як і змінні, оголошені після "статичних" - просто залиште знаки долара. G :: Example може бути прикладом глобальної константи.
Девід Спектор

5

Ви відповіли на це так, як ви написали запитання - використовуйте "визначити". але після встановлення ви не можете змінити визначення.

Крім того, є трюки з константою в класі, наприклад, клас :: константа, яку ви можете використовувати. Ви також можете зробити їх змінними, оголосивши статичні властивості класу, з функціями для встановлення статичного властивості, якщо ви хочете його змінити.


5

Ви можете спробувати ключове слово useу функціях закриття або лямбдасі, якщо це відповідає вашому наміру ... Хоча PHP 7.0. Не це краще, а просто альтернатива.

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

демо | інформація


1

Подумаємо трохи інакше:

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

І ви можете використовувати та змінювати його будь-коли, як вам подобається:

function func(){
    echo globe::$foo;
}

0

Що робити, якщо ви використовуєте процедурну функцію замість змінної та називаєте їх куди завгодно, як ви.

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

function host()
{
   return "localhost";
}

0

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

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

function my_var() {
    return 'Rome';
}

-19

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


19
ГЛОБАЛИ РЕЄСТРУВАННЯ видалено. не глобалісти.
єдність100

7
Ця відповідь, як написано, є помилковою, і її слід оновлювати, щоб відобразити коментар єдності100. Якщо GLOBALS все ще доступні, уточнюйте, які аспекти змін GLOBAL змінилися. Щось на зразок цього.
краш-перепад


@RobertColumbia Дуже цікавий пост, і я буду враховувати інші відповіді, але це не стосується конкретного випадку. (Я сподіваюся, що ви просто використовуєте цю мета, щоб вказати, наскільки відповідь "не роби цього" може бути дійсною, але не як обґрунтування того, що це;)) " " Не робити цього " може бути вірною відповіддю . "-" може бути "не" є ". " Але іноді нічого не потрібно робити замість цього. Якщо ви просто перестанете робити неправильну справу, все магічно почне знову працювати. " - Не застосовується тут, оскільки код не "зламаний". ОП просто хоче "менш типізувати" спосіб робити справи. …
robinCTS

" це насправді намагається відповісти на питання? У більшості випадків це так. " - "Більшість", а не "всі". (Я навіть заперечував би проти "більшості", але я не бачив достатньо таких відповідей, щоб зробити обгрунтований аргумент.) " У цьому випадку це не так. " - І в цій "відповіді" це також не з тих самих причин: " Гірше, відповідь Мерфі не пропонує рішення проблеми " і " Це не дає запитуючий інструмент або метод або що-небудь взагалі нагадує рішення своєї проблеми ". …
robinCTS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.