Toon posts:

[PHP5] $GLOBALS leeg?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een config.php bestandje met een cfg variabele. Aan het eind van het bestand wordt deze array in $GLOBALS['arrConfig'] gezet. Vervolgens wordt in meerdere classes config.php geinclude (dmv include_once). Het lijkt er alleen op dat wanneer ik voor de tweede keer arrConfig aan wil roepen dat heel de globals array leeg is. Print_r($GLOBALS) geeft niets terug (dus ook geen _POST e.d.).

$arrConfig werkt nergens, $GLOBALS['arrConfig'] alleen de eerste keer. Iemand enig idee hoe dit kan?

global $cfg; werkt overigens ook niet in classes blijkbaar. Vandaar dat ik er een superglobal van wilde maken. Andere oplossingen zijn uiteraard ook welkom.

  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 15:30
volgens mij moet je ook

$_GLOBALS gebruiken?

of is het een typefout in je post?

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:38
Nee, het is inderdaad $GLOBALS.

Maar voor zover ik weet kun je zo niet je GLOBALS vullen. Zo creëer je recursie.

Als jij een arrat vult in de variabele "$array". Dan vind je deze automatisch ook terug in $GLOBALS['array']. Enige reden die ik kan verzinnen waarom je hem hier ook nog eens handmatig in zou willen zetten, is omdat je wuilt dat deze variabele "super globaal" wordt. Maar dat kan niet.

[ Voor 55% gewijzigd door frickY op 30-11-2006 17:22 ]


  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 15:30
ah, Ok, waarom zouden we die variabele collectie benaming consistent houden ;)

Verwijderd

Topicstarter
Je beweert nu dus dat elke variabele in $GLOBALS komt? Dat zou betekenen dat alle variabelen superglobals zijn? Of begrijp ik je verkeerd? Dat is iig niet het geval.

Ik wil idd gewoon zelf een superglobal aan kunnen maken en volgens de PHP manual is $GLOBALS daar voor bedoeld?
ah, Ok, waarom zouden we die variabele collectie benaming consistent houden
Het idee is volgens mij dat $GLOBALS de 'ubersuperdepuperglobal' variabele is die bestaat uit een array van alle superglobals (dus $GLOBALS['_SERVER'], $GLOBALS['_POST'] etc). Daarom is de naam niet helemaal consistent omdat het niet in hetzelfde rijtje hoort.

[ Voor 39% gewijzigd door Verwijderd op 30-11-2006 17:33 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Kun je het probleem terugbrengen tot een tiental regels en dan hier posten? Ik gok dat je ergens iets fout doet; en een dergelijke fout is met de code erbij wat eenvoudiger te spotten :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Verwijderd schreef op donderdag 30 november 2006 @ 17:06:
Andere oplossingen zijn uiteraard ook welkom.
Voor het globaal beschikbaar maken van instellingen gebruik ik zelf bij voorkeur constanten. Sinds PHP5 kun je het met klasse-constanten oplossen waardoor het ook nog eens duidelijk is waar de boel gedefinieerd is:
PHP:
1
2
3
4
5
6
7
8
class CONFIG {
  const DB_USER = 'T-MOB';
  const DB_PASS = 'supersecret';
}


//nu kun je ze waar dan ook in je code aanspreken, bijv:
mysql_connect(CONFIG::DB_USER, CONFIG::DB_PASS);

Regeren is vooruitschuiven


Verwijderd

Topicstarter
Constanten zijn inderdaad wel een mogelijkheid, maar ik vind het wat onhandig als je erg veel instellingen hebt. Dan krijg je ook zoveel constanten.

Voorbeeld code:
Config.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
/* DATABASE */
$cfg['db']['host']               = 'localhost';
$cfg['db']['database']           = 'lorrentzen';
$cfg['db']['username']           = 'root';
$cfg['db']['password']           = '';
$cfg['db']['persistent']         = true;

/* LOGIN */
$cfg['usergroups'][]             = 'Customer';
$cfg['usergroups'][]             = 'Assembler';
$cfg['usergroups'][]             = 'Manager';

$GLOBALS['arrConfig'] = $cfg;


Class.login.php
PHP:
1
2
3
4
5
6
7
8
9
10
//constructor dus, class bevat een singleton (getInstance) method
public function Login() {
      session_start();
      include_once('config.php');
      include_once('class.sql.php');
      
      $this->cfg = $arrConfig;
      $this->sql =& Sql::getInstance();
      $this->loggedIn = false;
}


Class.sql.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
public function connect() {
      if(empty($this->link)) {
         include_once('config.php');
         
         $cfg = $arrConfig;
         
         $this->server     =  $cfg['db']['host'];
         $this->username   =  $cfg['db']['username'];
         $this->password   =  $cfg['db']['password'];
         $this->database   =  $cfg['db']['database'];
         $this->persistent =  $cfg['db']['persistent'];
     }
}

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:38
offtopic:
Misschien je root-password even weghalen?

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Misschien moet je' je includes buiten je functies doen, los daarvan; als je $GLOBALS['arrConfig'] aanmaakt, dan lijkt me toch logisch dat je hem ook als $GLOBALS['arrConfig'] aan moet spreken? Of ben ik niet op de hoogte van PHP's rare variabele-verwerking?

  • Cipri
  • Registratie: Januari 2001
  • Laatst online: 29-07-2024

Cipri

Of niet natuurlijk...

Zodra je die functies aanroept zal hij zoeken naar de $arrConfig variabele, maar volgens mij zit die niet in de huidige var-scope. Kan je niet
$cfg = $GLOBALS['arrConfig'];
doen? Dat zou moeten werken :)

-=[ Murlocs Ate My Boots]=- Sylvanas Alliance - EU - Orosei lvl 100 Paladin


Verwijderd

Topicstarter
frickY schreef op zaterdag 02 december 2006 @ 11:18:
offtopic:
Misschien je root-password even weghalen?
Hehe oops. Tis op m'n laptop localhost, maar toch, je hebt een punt ;).
Misschien moet je' je includes buiten je functies doen, los daarvan; als je $GLOBALS['arrConfig'] aanmaakt, dan lijkt me toch logisch dat je hem ook als $GLOBALS['arrConfig'] aan moet spreken? Of ben ik niet op de hoogte van PHP's rare variabele-verwerking?
Euh ja, dat had ik beide geprobeerd. $arrConfig bestaat helemaal niet. Met $GLOBALS['arrConfig'] heb ik dus het probleem dat het niet altijd werkt. Omdat $_POST e.d. ook in globals staan dacht ik dat ze gelijk als superglobals beschikbaar waren, maar blijkbaar geldt dat niet helemaal zo voor eigen gefabriceerde superglobals.

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Zet die dingen gewoon zoals ze zijn, en als je ze nodig hebt in een functie doe je even global $cfg; oid. Hetzelfde effect.

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 10:33
offtopic:
In principe maakt het niet uit of je een array neemt of constanten. Jouw code is overzichtelijk maar behoorlijk "diep". Als je constanten hebt, dan hou je makkelijker het overzich.

[ Voor 5% gewijzigd door EnsconcE op 02-12-2006 11:38 . Reden: Wou me in de discussie mengen, toch maar offtopic gemaakt. ]


Verwijderd

Topicstarter
GX schreef op zaterdag 02 december 2006 @ 11:29:
Zet die dingen gewoon zoals ze zijn, en als je ze nodig hebt in een functie doe je even global $cfg; oid. Hetzelfde effect.
Maar dat werkte dus ook niet (zoals gezegd in de openingspost). Zelfde probleem. Dat was ook mijn eerste oplossing namelijk.

Wat de constanten betreft, mijn config file is wel groter dan dit. Het ging maar even om het idee. Ik vind het gebruik van constanten dan niet echt overzichtelijk meer. Maar als ik er echt niet uit kom dan is het altijd nog een optie..

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Het lijkt mij sterk dat een "global $var;" niet werkt; dan heb je gewoon iets (bijzonder) fout gedaan, zoals bijvoorbeeld het bestand includen _in_ je functie. In het laatste geval heb je eigenlijk geen global nodig omdat je variabele daar gedefinieerd worden....

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
Verwijderd schreef op zaterdag 02 december 2006 @ 11:13:
Constanten zijn inderdaad wel een mogelijkheid, maar ik vind het wat onhandig als je erg veel instellingen hebt. Dan krijg je ook zoveel constanten.
Tsja, nu heb je zoveel array members. Daarnaast heb je door het plaatsen in het GLOBALS array geen enkele garantie dat je instellingen tijdens het draaien van het programma hetzelfde blijven. Een globale variabele blijft immers een variabele - en dus variabel.
Wil je toch met een array werken dan zou ik dat array ergens beschermen. Bijvoorbeeld in de private scope van een klasse. Een simpel voorbeeldje dat werkt met je huidige config bestand:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class config {

    private static $_settings;
    
    public static function getSettings() {
        if (empty(self::$_settings)) {
            self::_loadSettings();
        }
        return self::$_settings;
    }
    
    private static function _loadSettings() {
        require_once 'config.php';
        self::$_settings = $cfg;
    }
}

//overal waar je je config-array nodig hebt kun je nu:
$cfg = config::getSettings();

Regeren is vooruitschuiven


Verwijderd

Topicstarter
T-MOB schreef op zaterdag 02 december 2006 @ 12:33:
[...]


Tsja, nu heb je zoveel array members. Daarnaast heb je door het plaatsen in het GLOBALS array geen enkele garantie dat je instellingen tijdens het draaien van het programma hetzelfde blijven. Een globale variabele blijft immers een variabele - en dus variabel.
Wil je toch met een array werken dan zou ik dat array ergens beschermen. Bijvoorbeeld in de private scope van een klasse. Een simpel voorbeeldje dat werkt met je huidige config bestand:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class config {

    private static $_settings;
    
    public static function getSettings() {
        if (empty(self::$_settings)) {
            self::_loadSettings();
        }
        return self::$_settings;
    }
    
    private static function _loadSettings() {
        require_once 'config.php';
        self::$_settings = $cfg;
    }
}

//overal waar je je config-array nodig hebt kun je nu:
$cfg = config::getSettings();
Thanks, dit vind ik eigenlijk wel de meest nette oplossing. En hij werkt :). Ik denk dat de variabele inderdaad toch ergens overschreven werd, ik heb alleen geen idee waar.

NIW, de constanten/variabele discussie blijft denk ik toch een kwestie van smaak ;). Aan de ene kant is een constante idd voor niet-veranderende data bedoeld, maar aan de andere kant biedt het ook wat minder functionaliteit om het logisch in te kunnen delen (a la arrays dus).

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Verwijderd schreef op donderdag 30 november 2006 @ 17:30:
Het idee is volgens mij dat $GLOBALS de 'ubersuperdepuperglobal' variabele is die bestaat uit een array van alle superglobals (dus $GLOBALS['_SERVER'], $GLOBALS['_POST'] etc). Daarom is de naam niet helemaal consistent omdat het niet in hetzelfde rijtje hoort.
Volgens mij is dit niet het idee. Volgens mij is $GLOBALS een manier om via array accesses alle variabelen in de globale scope te benaderen. MAAR: als je dus in je config.inc.php een variabele $arrConfig in de globale scope definieert hoef je die als het goed is niet meer expliciet in $GLOBALS te zetten. ($GLOBALS is zelf wel superglobal, dus ook toegankelijk vanuit functies zonder eerst global $GLOBALS te doen.)

Rustacean


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Maar door de include van het bestand in de functie zitten de daarin gedefinieerde variabelen m.i. niet in de global scope maar in de scope van die functie, en daarom is de verwachting het te kunnen gebruiken d.m.v. $GLOBALS fout.
Pagina: 1