Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] $GLOBALS['var'] a global $var - roznice
Forum PHP.pl > Forum > Przedszkole
erix
Witam!

Czy sa jakies roznice (wydajnosc, bezpieczenstwo, wylaczajac zasieg) w operowaniu na zmiennych przez superglobalna $GLOBALS a wczesniejsza jej 'globalizacja' przez global?
em1X
a global to nie jest po prostu umieszczenie zmiennej w tablicy GLOBALS ? dry.gif
erix
Chyba nie...

Mam gdzies zmienna poza funkcja. I chce teraz ja powiedzmy odczytac.

Lepiej bedzie przez global czy $GLOBALS?

W $GLOBALS jest zawsze, ale mam tak skonstruowany kod, ze do zmiennej 'dojezdzam' dlugim autobusem...
siemakuba
zmienne które z natury mają zasięg globalny to takie których nie definiujesz wewnątrz funkcji, metody, które nie są wartościami w klasie. Zmienne te będziesz miał dostępne w tablicy $GLOBALS, czy zadeklarujesz je tam jawnie ($GLOBALS['a'] = 'b';) czy nie ($a = 'b'; -> tu oczywiście deklaracja musi być tam gdzie zasięg jest globalny).

Pomijając fakt, że powinno się dążyć do programowania w taki sposób aby korzystanie z globalnych zmiennych przez $GLOBALS czy global $zmienna nie było konieczne, jedyna różnica jaką widzę to wygoda.

Potrzebując w funkcji dużo zmiennych globalnyych musisz o nich wszystkich pamiętać i zadeklarować je jako globalne:
  1. <?php
  2. function someFunction()
  3. {
  4. global $var1, $var2, $var3, $varN;
  5. }
  6. ?>

Używając tablicy $GLOBALS nie musisz deklarować potrzebnych zmiennych jako globalne, bo jawnie korzystasz z nich jako globalnych ($GLOBALS['var1']). Skorzystanie z $GLOBALS wydaje mi się wpłynie też na czytelnośc kodu, bo ktoś (nawet ty sam po jakimś czasie) spoglądając na kod odrazu będzie wiedział skąd wzięły się dane zmienne.

pozdr.
erix
Cytat
jedyna różnica jaką widzę to wygoda

no i o taka odpowiedz mi chodzilo

a wracajac - w moim projekcie globalem byloby lepiej, bo musze powtarzac $GLOBALS praktycznie w kazdej linijce, a zmienna dostepna globalnie, to tablica.

Thx winksmiley.jpg
mike
Cytat(erix @ 18.06.2006, 13:31 ) *
(...) w moim projekcie globalem byloby lepiej, bo musze powtarzac $GLOBALS praktycznie w kazdej linijce...

Wywal ten projekt do kosza i zacznij pisać jeszcze raz.
Korzystanie ze zmienny globalnych to ostateczność. Całkowita ostateczność, nie powinno się z nich korzystać.
erix
UZASADNIJ.

Chodzi o to, ze mam zestaw klas i chce sie do jednej z nich odwolac z funkcji innej.

Tak OT, to gdybys z wewnatrz jakiejkolwiek klasy chcial odwolac sie do, dajmy na to, warstwy sql, to chyba inaczej nie daloby sie, nie?
mike
Cytat(erix @ 18.06.2006, 13:40 ) *
Chodzi o to, ze mam zestaw klas i chce sie do jednej z nich odwolac z funkcji innej.

Tworzysz instancję klasy wewnątrz innej klasy i wywołujesz metodę. Albo wywołujesz metodę statycznie o ile można to zrobić.

Cytat(erix @ 18.06.2006, 13:40 ) *
Tak OT, to gdybys z wewnatrz jakiejkolwiek klasy chcial odwolac sie do, dajmy na to, warstwy sql, to chyba inaczej nie daloby sie, nie?

Dlaczego?
Piszesz klasę na wzorcu singleton i tam gdzie chcesz to sobie pobierasz połączenie. Od lat tak robię.

Zresztą od lat pisze duże projekty i ostatni raz kiedy musiałem zastosować zmienne globalne to było ... nidgy.
erix
ale wciaz nie wiem dlaczego NIE STOSOWAC zmiennych globalnych... :/
siemakuba
Cytat
le wciaz nie wiem dlaczego NIE STOSOWAC zmiennych globalnych... :/
Myślę, że mamy tu pewne niezrozumienie. Zmiennych globalnych nie należy stosować ze względów przejrzystości kodu, łatwości modyfikacji. Z kodu powinno wynikać co skąd się bierze. Nie znam się na teorii programowania, ale wiem że korzystanie ze zmiennych globalnych przeczy np. istocie funkcji jako takich. Po co jest funkcja? Po to, żeby zebrać pewne czestwo powtarzane fragmenty kodu w jej ramach i zapewnić sobie łatwy dostęp do tych czynności. Stosując zmienne globalne przeczysz temu, bo musiałbyć w każdym fragmencie kodu w którym chcesz użyć danej funkcji zadbać o to żeby te globalne zeminne istniały i w efekcie funkja działała poprawnie. Po to się do funkji przekazuje parametry i po to funkcja zwraca wartość, żeby nie trzeba było uzależniać jej od danych bezpośrednio nie związanych z jej zadaniem.
Jeżeli natomiast funkcja jest używana tyklo w jednym miejscu, gdzie masz utworzone potrzebne zmienne globalne, wtedy... nie potrzebujesz do tego zadania funkji :)

Należy natomiast wyłączyć register_globals, co spodowuje że nie będzie autmatycznie ze zmiennej $_GET['wanda'] tworzona zmienna $wanda. Tu akurat może mieć to zasadniczy wpływ na bezpieczeństwo twojego skryptu.

pozdr.
em1X
Zmiennych globalnych nie powinno sie stosowac, poniewaz w duzych projektach w koncu doprowadzi to w pewnym miejscu do kolizji nazw zmiennych. W przypadku gdy wiele osob pracuje nad projektem, w wynikach zacznie sie pojawiac taki meksyk, ze przez miesiac nie dojdziecie dlaczego.

Sa pewne zasady programowania, ktorych programista powinien przestrzegac.. w kazdej szanujacej ksiazce o php o tym przeczytasz erix.

Pozdrawiam.
erix
To juz chyba standard, zeby nie korzystac z register_globals; nawet nie mysle o tym biggrin.gif

Ale, jak dla mnie, wygodniej bedzie z global $var, bo trzeba mi TYLKO jedna tablice zglobalizowac.

A bawic sie z rzutowaniem?

BTW: zapomnialem napisac, ze PHP4, nie 5 biggrin.gif
em1X
bynajmniej nie mowimy tutaj o register_globals, ale u uzywaniu global" title="Zobacz w manualu php" target="_manual.
erix
em1X, nadmienilem do siemakuba
to bylo tak OT...
em1X
offtopic.gif jasna sprawa tongue.gif

na przyszlosc pamietaj, ze wszelkie problemy globalizacji rozwiazuje Singleton. A takie rozwiazywanie problemow swiadczy juz o pewnej dojrzalosci w programowaniu (samodoskonalenie się).
siemakuba
Cytat(erix @ 18.06.2006, 14:32 ) *
To juz chyba standard, zeby nie korzystac z register_globals; nawet nie mysle o tym :D
rajt, wspomniałem o tym żeby nie było wątpliwości ;)
Cytat(erix @ 18.06.2006, 14:32 ) *
Ale, jak dla mnie, wygodniej bedzie z global $var, bo trzeba mi TYLKO jedna tablice zglobalizowac.
Moje zdanie jest takie, że najlepiej zaprogramować tak, żeby nie trzeba było uzywać global. Ale z drugiej strony jest on po to, żeby go uzyć tam gdzie nie da się inaczej ;>

BTW, skoro to tylko jedna tablica to jaki problem przekazać ją jako parametr? Jeżeli chcesz w funkcji zmieniać wartości tej tablicy a nie tylko korzystać z danych w niej zawartych, przekaż ją jako referencję.
  1. <?php
  2. function someFunction($param1, $param2, &$referenacjaDoTablicy)
  3. {
  4. }
  5. ?>


pozdr.
erix
O zesz! Chodzila mi po glowie referencja, ale nazwy zapomnialem...

Po dyskusji z em1Xem doszedlem do wniosku, ze bedzie lepiej, jesli przejde na Singleton biggrin.gif

EOT
em1X
Moze inni wyciągną wnioski co jest lepsze i wygodniejsze.
Link do wzorca Property dla wersji PHP5

Use case:
  1. <?php
  2. require 'Property.php';
  3.  
  4. Property::set('mysql_host', 'localhost');
  5. Property::set('mysql_user', 'root');
  6. Property::set('mysql_pass', 'pass');
  7.  
  8. function testGlobal()
  9. {
  10. echo "Polaczenie z MYSQL na hoscie ".Property::get('mysql_host')."<br/>";
  11. echo "user ".Property::get('mysql_user')."<br/>";
  12. echo "pass ".Property::get('mysql_pass')."<br/>";
  13. }
  14.  
  15. testGlobal();
  16. ?>
erix
Cytat(em1X @ 18.06.2006, 14:43 ) *


Jeszcze do tego linka: w przykladzie dla PHP4 wywala bledy, zadzialalo dopiero to: http://webcity.pl/webcity/artykuly.php/t/62

Wreszcie zrozumialem o co w tym naprawde chodzi. Dziekuje!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.