ugrás a tartalomhoz

PHP globális változó probléma

ha0rex · 2014. Feb. 28. (P), 13.15
Sziasztok,

A fontos, globálisan szükséges változókat $_ -al kezdődő névvel használom. Pl. bejelentkezett felhasználó $_user, beállítások: $_config, stb.

Hogy könnyebben el tudjam érni őket létrehoztam egy függvényt:

function h($type) {
global ${"_".$type};
return ${"_".$type};
}

így bármikor láthatom a bejelentkezett user emailcímét például így: h(user)->email.

Működik is a dolog szuperül, leszámítva a destruktoroknál, de szabályszerűséget itt sem véltem felfedezni.

Néha egyszerűen üresen tér vissza a h() függvény, máskor működik. Ha üres, pedig nem azt várom, és kipróbálom így:

global $_config;
echo $_config->path;

Akkor működik.

Számomra érthetetlen, de talán csak valami banális dolog.

Várom az ötleteket!

Köszi előre is!
 
1

Globalis

janoszen · 2014. Feb. 28. (P), 13.19
Ha jot akarsz magadnak, akkor szokj le a globalis valtozok hasznalatarol. Egyebirant nezd meg a $GLOBALS tombot, abban megtalalod amit keresel, foleg ha OOP-zel.
2

class H{ protected static

szabo.b.gabor · 2014. Feb. 28. (P), 14.11
class H{
	protected static $instances = array();

	public static function set($key,&$obj){
		self::$instances[$key] = $obj;
	}

	public static function get($key){
		return self::$instances[$key];
	}
}

//init
H::set('cfg',$_config);
H::set('user',$_user);


//hasznalat
function ize(){
	H::get('user')->email;
}
ne használj globális változókat, ez egy gagyi implementáció de már sokkal jobb. eggyel jobb az, ha átadsz neki vmi alap configot amiben megadod, hogy milyen kulcsra az adott objektumot hogyan kell inicializálni és csak akkor hozod létre, ha tényleg kell (lazy load, a get triggereli), pl egy adatbáziskapcsolatot, csak akkor létesít, ha tényleg kell.
4

ez egy gagyi implementáció de

Hidvégi Gábor · 2014. Feb. 28. (P), 20.41
ez egy gagyi implementáció de már sokkal jobb
Nem vagy előrébb, mert a set metódust ugyanúgy meghívhatod bármikor.

public static function set($key,&$obj) {
  if (!array_key_exists($key, self::$instances)) {
    self::$instances[$key] = $obj;
  }
}
5

nem mondtam, hogy használja

szabo.b.gabor · 2014. Feb. 28. (P), 23.02
nem mondtam, hogy használja ezt, de azért egy ::set-et sokkal nehezebb véletlenül meghívni..
3

Globális változók

Hidvégi Gábor · 2014. Feb. 28. (P), 20.32
A globális változók hosszú távon okozhatnak gondot, ha mondjuk a projekt nagyra nő, és többen dolgoznak rajta. A baj az velük, hogy változók, azaz bárki átírhatja őket, így az őket használó függvények által visszaadott érték is változhat. Ha egyedül dolgozol a kódon, és meg tudod állni, hogy ne módosíts rajtuk, akkor használd őket nyugodtan.

Ha nem vagy biztos magadban, de azt tudod, hogy az értékük futás közben nem fog változni (a konfigurációs értékek tipikusan ilyenek), a legegyszerűbb, ha konstanst csinálsz belőlük:
function konstans($valtozo, $ertek);
  define('KONFIG_' . strtoupper($valtozo), $ertek);
}
konstans('szelesseg', 20);
print KONFIG_SZELESSEG;

Vedd figyelembe, hogy a konstansok csak skaláris és null értékeket vehetnek fel.

Ha a globális változók értékei futás közben változhatnak, akkor trükközhetsz, de nincs mit tenni, figyelni kell rájuk.