it-swarm-eu.dev

globální proměnné v php nefungují podle očekávání

Mám problémy s globálními proměnnými v php. Mám soubor $screen var nastavený v jednom souboru, který vyžaduje jiný soubor, který volá initSession() definovaný v jiném souboru. initSession() deklaruje global $screen a poté zpracuje obrazovku $ dále dolů pomocí hodnoty nastavené v prvním skriptu.

Jak je tohle možné?

Aby se věci staly matoucími, pokud se pokusíte znovu nastavit obrazovku $ a pak zavoláte initSession(), použije znovu hodnotu, která byla použita jako první. Následující kód bude popisovat proces. Mohl by to někdo vysvětlit?

$screen = "list1.inc";            // From model.php
require "controller.php";         // From model.php
initSession();                    // From controller.php
global $screen;                   // From Include.Session.inc  
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc";          // From model2.php
require "controller2.php"         
initSession();
global $screen;
echo $screen; // prints "list1.inc" 

Aktualizace:
Pokud znovu deklaruji $screen globálně těsně před požadavkem na druhý model, bude obrazovka $ správně aktualizována pro metodu initSession(). Zvláštní.

25
Josh Smeaton

Global NEVYKONUJE proměnnou globální. Vím, že je to složité :-)

Global říká, že bude použita lokální proměnná jako by to byla proměnná s vyšším rozsahem .

E.G:

<?php

$var = "test"; // this is accessible in all the rest of the code, even an included one

function foo2()
{
    global $var;
    echo $var; // this print "test"
    $var = 'test2';
}

global $var; // this is totally useless, unless this file is included inside a class or function

function foo()
{
    echo $var; // this print nothing, you are using a local var
    $var = 'test3';
}

foo();
foo2();
echo $var;  // this will print 'test2'
?>

Všimněte si, že globální vars je zřídka dobrý nápad. Můžete kód 99.99999% času bez nich a váš kód je mnohem snazší udržet, pokud nemáte fuzzy rozsahy. Pokud je to možné, vyhněte se global.

61
e-satis

global $foo neznamená, že tato proměnná je globální, takže ji může používat každý. global $foo znamená " v rámci této funkce , použijte globální proměnnou $foo". 

Předpokládám z vašeho příkladu, že pokaždé, když se odvoláváte na obrazovku $ z funkce. Pokud ano, budete muset použít global $screen v každé funkci.

15
Athena

Máte-li v průběhu úlohy, která používá mnoho funkcí, k dispozici mnoho proměnných, zvažte, zda je třeba použít objekt „kontext“.

//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();

doFoo($fooContext);

Nyní stačí předat tento objekt jako parametr všem funkcím. Nebudete potřebovat globální proměnné a vaše podpisy funkcí zůstanou čisté. Je také snadné později nahradit prázdnou třídu StdClass třídou, která má v sobě relevantní metody.

4
Internet Friend

Musíte dát "globální $ screen" v každé funkci, která odkazuje, ne jen v horní části každého souboru.

4
finnw

Globální rozsah zahrnuje zahrnuté a požadované soubory, nemusíte používat globální klíčové slovo, pokud nepoužíváte proměnnou v rámci funkce. Místo toho můžete zkusit použít pole $ GLOBALS.

1
zobier

Před definováním hodnot pro něj musíte deklarovat proměnnou jako globální.

0

Je to zbytečné, dokud není ve funkci nebo třídě. Globální znamená, že můžete použít proměnnou v jakékoli části programu. Takže pokud globální není obsažena ve funkci nebo třídě, není použití globálního použití

0
user3651145