Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] $GLOBALS['var'] a global $var - roznice
erix
post
Post #1





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Witam!

Czy sa jakies roznice (wydajnosc, bezpieczenstwo, wylaczajac zasieg) w operowaniu na zmiennych przez superglobalna $GLOBALS a wczesniejsza jej 'globalizacja' przez global?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
em1X
post
Post #2





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


a global to nie jest po prostu umieszczenie zmiennej w tablicy GLOBALS ? dry.gif


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
siemakuba
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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

Ten post edytował erix 18.06.2006, 12:32:04


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mike
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
erix
post
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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?

Ten post edytował erix 18.06.2006, 12:40:42


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mike
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




ale wciaz nie wiem dlaczego NIE STOSOWAC zmiennych globalnych... :/


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
siemakuba
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
em1X
post
Post #11





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


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.


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
erix
post
Post #12





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
em1X
post
Post #13





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


bynajmniej nie mowimy tutaj o register_globals, ale u uzywaniu global" title="Zobacz w manualu php" target="_manual.


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
erix
post
Post #14





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




em1X, nadmienilem do siemakuba
to bylo tak OT...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
em1X
post
Post #15





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


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ę).


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
siemakuba
post
Post #16





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
erix
post
Post #17





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
em1X
post
Post #18





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował em1X 18.06.2006, 14:35:53


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
erix
post
Post #19





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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!


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 17:59