Jak zadeklarować zmienną globalną w php?


168

Mam kod coś takiego:

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

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

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

czy istnieje sposób na zdefiniowanie zmiennej globalnej w jednym miejscu i udostępnienie zmiennej jednocześnie $awe wszystkich funkcjach? bez używania global $a;więcej?


15
Nie, nie ma. Jeśli nie podoba ci się globalsłowo kluczowe, rozważ użycie $GLOBALS['a']superglobal we wszystkich zakresach lub rozważ przekazanie parametru do swoich funkcji.
Michael Berkowski

5
Jeśli jest to coś ważnego, można użyć nawet zmiennej sesji.
Nikos Tsirakis

Odpowiedzi:


259

$GLOBALSTablica może być stosowana zamiast:

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

function body(){

    echo $GLOBALS['a'];
}

Z instrukcji :

Tablica asocjacyjna zawierająca odniesienia do wszystkich zmiennych, które są aktualnie zdefiniowane w globalnym zakresie skryptu. Nazwy zmiennych są kluczami tablicy.


Jeśli masz zestaw funkcji, które wymagają pewnych wspólnych zmiennych, klasa z właściwościami może być dobrym wyborem zamiast globalnej:

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

Jeśli zmienna nie ma się zmienić, możesz użyć define

Przykład:

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

function footer()
{
    echo FOOTER_CONTENT;
}

2
Co się dzieje, gdy FOOTER_CONTENTpróbujesz zmienić? Czy jest tak jak finalw Javie czy constw C, C ++ i C #?
Lion

4
Jeśli spróbujesz zdefiniować FOOTER_CONTENT po raz drugi, php wyśle ​​powiadomienie o tym
Dale

Musiałem obliczyć bieżącą epokę unixa za każdym razem, gdy strona jest ładowana, a następnie użyć tej wartości w kilku obliczeniach (funkcjach). „Definicja” zadziałała dla mnie. Początkowo nie widziałem, że „echo FOOTER_CONTENT;” nie miał poprzedzającego znaku „$” i wystąpiły błędy.
user208145

Jeśli zmienna nie ma się zmienić, to nie jest zmienną. Czy to nie jest ?!
Sajidur Rahman

29

Dodaj swoje zmienne w superglobalnej tablicy $ GLOBALS, takiej jak

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

i używaj go na całym świecie

lub możesz użyć stałych, które są dostępne w całym skrypcie

define('HOSTNAME', 'localhost');  

1
Jeśli używasz „define”, po ustawieniu nie możesz zmienić definicji!
Reza MA

w pierwszym przykładzie jest to informacja, że ​​zmienna „$” w dalszej części skryptu nazywa się teraz „localhost”?
Zach Smith

nie, jeśli chcesz użyć tej zmiennej, musisz jej używać jak $ GLOBALS ['zmienna'];
Pankaj Khairnar

25

Jeśli zmienna jest zadeklarowana poza funkcją, jest już w zasięgu globalnym. Nie ma więc potrzeby deklarowania. Ale skąd wywołujesz tę zmienną, musi mieć dostęp do tej zmiennej. Jeśli dzwonisz z wnętrza funkcji, musisz użyć globalsłowa kluczowego:

$variable = 5;

function name()
{
    global $variable;

    $value = $variable + 5;

    return $value;  

}

Używanie słowa kluczowego global poza funkcją nie jest błędem. Jeśli chcesz dołączyć ten plik do funkcji, możesz zadeklarować zmienną jako global.

config.php

global $variable;

$variable = 5;

other.php

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

Możesz również użyć $GLOBALS. Jest superglobalny, więc ma dostęp wszędzie.

$GLOBALS['variable'] = 5;

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

W zależności od wyboru możesz wybrać jedną z nich.


9

Ta odpowiedź jest bardzo późna, ale to, co robię, to ustawiam klasę, która przechowuje wartości logiczne, tablice i początkowe wartości całkowite jako zmienne statyczne o zasięgu globalnym. Wszelkie ciągi stałe są definiowane jako takie.

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

Te staticsłowa kluczowe muszą być obecne w klasie przeciwnym razie vars $ a, $ b, $ c i nie będzie objęty zakresem globalnie.


To dobre rozwiązanie z wielu powodów. Class static wymaga tylko kilku znaków dodanych do podstawowej nazwy zmiennej: G :: $ Name, gdzie deklaracja wygląda następująco: class G {static $ Name, $ Name2;} Zauważ, że G może być zmiennymi prawdziwie globalnymi, wtedy E może być używane dla zmiennych odnoszących się do pracowników. Jest to łatwiejsze w programowaniu niż pełnowymiarowy paradygmat obiektowy obsługiwany przez PHP. Jeśli stałe są naprawdę potrzebne, możesz zadeklarować je po "const", tak jak zmienne zadeklarowane po "static" - po prostu pomiń znaki dolara. G :: Przykład byłby przykładem stałej globalnej.
David Spector

5

Odpowiedziałeś na to w sposób, w jaki napisałeś pytanie - użyj „zdefiniuj”. ale po ustawieniu nie możesz zmienić definicji.

Alternatywnie istnieją triki ze stałą w klasie, na przykład class :: constant, których możesz użyć. Możesz również uczynić je zmiennymi, deklarując właściwości statyczne w klasie, z funkcjami ustawiającymi właściwość statyczną, jeśli chcesz ją zmienić.


5

Możesz wypróbować słowo kluczowe usew funkcjach zamykania lub Lambdach jeśli pasuje to do twoich intencji ... chociaż PHP 7.0. Nie to jest lepsze, ale po prostu alternatywa.

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

demo | info


1

Pomyślmy trochę inaczej:

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

I możesz go używać i modyfikować w dowolny sposób, na przykład:

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

0

A co, jeśli zamiast zmiennej użyjesz funkcji proceduralnej i wywołasz je gdziekolwiek, jak ty.

Zwykle tworzę zbiór wartości konfiguracyjnych i umieszczam je w funkcji z instrukcją return. Po prostu dołączam to, gdzie muszę wykorzystać globalną wartość i wywołać określoną funkcję.

function host()
{
   return "localhost";
}

0

$GLOBALS[] to właściwe rozwiązanie, ale ponieważ mówimy o alternatywach, funkcja może również łatwo wykonać tę pracę:

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

function my_var() {
    return 'Rome';
}

-19

Nie powinieneś już używać globali, nie są one dostępne w PHP 5.4.


19
REGISTER GLOBALS został usunięty. nie globalne.
jedność100

7
Ta odpowiedź, tak jak napisano, jest błędna i powinna zostać zaktualizowana, aby odzwierciedlić komentarz unity100. Jeśli GLOBALS są nadal dostępne, prosimy o wyjaśnienie, jakie aspekty zmiennych GLOBAL uległy zmianie. Coś takiego.
crashwap


@RobertColumbia Bardzo ciekawy post i będę pamiętać o innych odpowiedziach, ale nie ma to zastosowania w tym konkretnym przypadku. (Mam nadzieję, że używasz tej meta tylko do wskazania, że ​​odpowiedź „nie rób tego” może być ważna, a nie jako uzasadnienie, że jest;)) „Nie rób tego” może być poprawną odpowiedzią . „-” może oznaczać „nie” jest. „ Ale czasami nic nie trzeba robić zamiast tego. Jeśli po prostu przestaniesz robić coś złego, wszystko w magiczny sposób zacznie znowu działać. ” - Nie ma tutaj zastosowania, ponieważ kod nie jest „zepsuty”. OP chce po prostu mniej pisać na klawiaturze. …
robinCTS

czy rzeczywiście próbuje odpowiedzieć na pytanie? W większości przypadków tak jest. ” - „Większość”, a nie „wszystkie”. (Sprzeciwiłbym się nawet „większości”, ale nie widziałem wystarczającej liczby takich odpowiedzi, aby sformułować uzasadniony argument). „ W tym przypadku tak nie jest. ” - I w tej „odpowiedzi” też tak nie jest, z tych samych powodów: „ Gorzej, odpowiedź Murphy'ego nie proponuje rozwiązania problemu ” i „ Nie daje pytający narzędzie lub metoda, lub cokolwiek, co przypomina rozwiązanie jego problemu ”. …
robinCTS
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.