Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> global, zle ?
nasty
post 16.07.2006, 08:26:24
Post #1





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Chcialbym sie dowiedziec czmu wszyscu na forum tak bardzo nie lubia global w klasach i funkcjach.
Jak oladalem sobie kod typo3 to tam jest pelno globalow zreszta tak jest w b. duzej ilosci skryptow ...
Go to the top of the page
+Quote Post
Cysiaczek
post 16.07.2006, 08:33:47
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Globale są "be" z kilku powodów. Jednym z ważniejszych jest to, że wiążą ze sobą w sposób bardzo ścisły elementy aplikacji, które powinny byc maksymalnie niezależne. potem masz problemy np. z przeniesieniem kodu do innego projektu.
Z takich bardziej przyziemnych powodów, to globale mają tę wadę, że mogą zostac nadpisane w miejscu najmniej spodziewanym i może być kłopot.

Ten post edytował Cysiaczek 16.07.2006, 08:39:35


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 08:41:04
Post #3





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


no ale jak robie sobie program i nie mam zamiary zeby jego kod byl framewokiem albo uzywany gdzies indziej, to chyba nie jest "be" ?

Ten post edytował nasty_psycho 16.07.2006, 08:41:21
Go to the top of the page
+Quote Post
Cysiaczek
post 16.07.2006, 08:53:31
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




No dobrze. Możesz tak zrobić i będzie działało smile.gif Po co jednak pisać klasy, używać obiektów? Jedna z podstawowych zasad OOP jest zasada hermetyzacji - wlicza się w to również stosowanie zmienych globalnych.
Żeby nie było, że zmienne globalne są zupełnie nieużywane, to podam przykład singletona, który też jest pewnego rodzaju daną globalną. Ma tylko trochę mniej wad smile.gif


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Ludvik
post 16.07.2006, 10:27:38
Post #5





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Odpowiedz sobie na takie pytania:
- Jak się upewnisz, czy zawartość zmiennej globalnej jest prawidłowa?
- Czy będziesz potrafił zachować spójność danych w tej zmiennej?
- Gdzie będziesz szukał błędów związanych z tą zmienną, skoro wszędzie będziesz miał do niej całkowity dostęp?

Myślę, że nie bez podstaw nikt nie toleruje używania zmiennych globalnych. W przypadku zmian związanych z tą zmienną, cały skrypt Ci się sypie...

Cytat
no ale jak robie sobie program i nie mam zamiary zeby jego kod byl framewokiem albo uzywany gdzies indziej, to chyba nie jest "be" ?

To czy coś jest "be", czy nie, nie określa zastosowanie kodu, a jego jakość.

Cytat
Jak oladalem sobie kod typo3 to tam jest pelno globalow zreszta tak jest w b. duzej ilosci skryptow ...

Oj tak, w bardzo dużej ilości skryptów to znajdziesz. Teraz popatrz jak ludzie się rzucili na php, dzięki jego dostępności i prostocie. Popatrz jakie posty znajdują się czasem w przedszkolu... To, że dużo ludzi tego używa, nie znaczy, że jest to prawidłowe zachowanie.


--------------------
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 10:38:30
Post #6





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
Jak się upewnisz, czy zawartość zmiennej globalnej jest prawidłowa?

tak samo jak sie upewniam z narmalnymi zmiennymi, a pozatym w globalach to zazwyczaj jest link to $_DB, itd.
Cytat
Oj tak, w bardzo dużej ilości skryptów to znajdziesz. Teraz popatrz jak ludzie się rzucili na php, dzięki jego dostępności i prostocie. Popatrz jakie posty znajdują się czasem w przedszkolu... To, że dużo ludzi tego używa, nie znaczy, że jest to prawidłowe zachowanie.

Ale chyba TYPO3 nie jest zle, i nie jest robione przez amatorow ?

ja nie probuje udowodnic ze global sa dobre, ale ja ich uzywam np http://crystalpage.sf.net/code , tam zobaczysz o co mi chodzi z globalami jak zobaczysz plik init.php i pliki z katalogu cpLib, i chce sie dowiedziec czy oz tak zle sa czy poprostu nie lubiane bo nie lubiane i koniec tongue.gif.
Go to the top of the page
+Quote Post
Ludvik
post 16.07.2006, 10:52:12
Post #7





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
Cytat
Jak się upewnisz, czy zawartość zmiennej globalnej jest prawidłowa?

tak samo jak sie upewniam z narmalnymi zmiennymi, a pozatym w globalach to zazwyczaj jest link to $_DB, itd.

Tak sądzisz? Zmienne globalne nie mają żadnej kontroli typów. Przekazując zmienną do metody możesz wpłynąć na jej typ i robisz to w jednym miejscu. Potem zapisujesz wartość i wiesz, że zawsze będzie ona poprawna... A co mi z tego, że zmienna nazywa się $_DB, skoro za chwilę może wyglądać identycznie jak $_CP (zupełnie nieintuicyjna nazwa...) albo $string?


--------------------
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 11:04:48
Post #8





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
$_CP (zupełnie nieintuicyjna nazwa...)

$_CP => CrystalPage ale na localu od dawna zmienilem na $_SYS

a co mi z kontroli typow jak ja tam chowam tylko zmienne comfig-u i db?
np. gdzie jest folder z cachem albo user do bazy danych...
tutaj niema co sie bawic w typy w takim przypadku
Go to the top of the page
+Quote Post
NuLL
post 16.07.2006, 11:25:59
Post #9





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Moze zdanie o slowie global jest takie ze powinni dac w php.ini mozliwosc wylaczenia tego slowa wogole ze skladni guitar.gif

Typo3 - hmm - zajrzyj sobie do eZ publisha i ew stamtad bierz przyklady.


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 11:28:01
Post #10





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
Typo3 - hmm - zajrzyj sobie do eZ publisha i ew stamtad bierz przyklady.
OT: TYPO3 jest co najmniej 1000 razy lepsze od eZ publish
Go to the top of the page
+Quote Post
mike
post 16.07.2006, 11:30:02
Post #11





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

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


Cytat(nasty_psycho @ 16.07.2006, 12:28 ) *
OT: TYPO3 jest co najmniej 1000 razy lepsze od eZ publish

LOL
Ładniej wygląda czy jest lepiej i funkcjonalniej napisane?
To pierwsze to może i tak tongue.gif
To drugie? ROTFL
Go to the top of the page
+Quote Post
Ludvik
post 16.07.2006, 11:32:10
Post #12





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
$_CP => CrystalPage ale na localu od dawna zmienilem na $_SYS

Rozumiem, że było fajną rozrywką zmieniać wszelkie odwołania do zmiennej $_CP na $_SYS.
Cytat
a co mi z kontroli typow jak ja tam chowam tylko zmienne comfig-u i db?
np. gdzie jest folder z cachem albo user do bazy danych...
tutaj niema co sie bawic w typy w takim przypadku

Czyli oczekujesz, że zawsze znajdzie się tam tablica? Czyli jednak potrzebujesz kontroli typów... Zrozum, że do tej zmiennej możesz przypisać co chcesz, gdzie chcesz i kiedy chcesz. Na dobrą sprawę przed każdym użyciem wypadało by sprawdzić, czy wciąż zawartość jest poprawna. Chcę zobaczyć, jak piszesz do tego testy... Bo chyba poważny CMS, powinien być przetestowany?

Takim sposobem otwierasz sobie furtkę do błędów, których nie wyłapią Ci żadne testy. Ja, kiedy przekazuję obiekt z referencją do DAO, wiem, że dostanę wewnątrz klasy zawsze to, czego potrzebuję. Natomiast po twojej zmiennej $_DB nie wiem czego się mam spodziewać? AdoDB? PEAR:biggrin.gifB? Propel? PDO? Moje klasy zawsze będą poprawne, bez względu na to, co przekażesz im jako obiekt DAO, bo zawsze interfejs będzie prawidłowy. Twoje zależą od zmiennej globalnej, nad którą nie masz kontroli. W momencie testu nie jesteś w stanie zapewnić, że ta zmienna zawsze będzie poprawna.

Na dobrą sprawę, wywołując dwa zapytania, a pomiędzy nimi jakieś instrukcje, możesz nawet nie dowiedzieć się, że używasz innej bazy danych...


--------------------
Go to the top of the page
+Quote Post
NuLL
post 16.07.2006, 11:36:13
Post #13





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat(nasty_psycho @ 16.07.2006, 12:28 ) *
OT: TYPO3 jest co najmniej 1000 razy lepsze od eZ publish

OT: Ty dddddddduuuuuuuuuuzzzzzzzzzzooooooooooo jeszcze musisz sie nauczyc o programowaniu - oj duzo laugh.gif

EOT


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 11:45:40
Post #14





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
OT: Ty dddddddduuuuuuuuuuzzzzzzzzzzooooooooooo jeszcze musisz sie nauczyc o programowaniu - oj duzo

A ty jeszcze wiecej...
"Krowa, która dużo ryczy, mało mleka daje"
---------------------------------------------------------------------------

W tym $_DB zawsze jest tylko i wylacznie link to objektu ADO i nie bede tam wstawiac PDO czy innych perdul, a moge byc pewny ze tam jest to co chce bo sa w globalach zachowywane tylko dane z plikow ini ktore sa zbierane za pomoca PEAR::Config, i ja sie nie zbiorol to skrypt nie konczy tylko pokazuje errora ( to co jest uplodowane to jest stare i chcialem zebyc tylko zobaczyl o co mi chodzilo). i z $_DB tak samo jak sie nie poloczy to nie knoczy egzekucji.
Po drugie zarowno $_SYS jak i $_DB sa uzywane tylko przez cms i nikt niema do nich dostepu oprucz samego cms-u.
Go to the top of the page
+Quote Post
Ludvik
post 16.07.2006, 11:53:52
Post #15





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Cytat
Po drugie zarowno $_SYS jak i $_DB sa uzywane tylko przez cms i nikt niema do nich dostepu oprucz samego cms-u.

Rozumiem, że zabronisz ich używania? Czyli nie przewidujesz w swoim systemie rozszerzeń? To cóż to za CMS, którego nie można rozszerzać...

A teraz mam dla Ciebie zagadkę w postaci kodu php.
  1. <?php
  2. function chaos() {
  3. global $_DB;
  4. $db[1] = new PDO('...');
  5. $db[2] = new AdoDBConnection('...');
  6. $db[3] = new InnyObiektDAO('...');
  7. $random = rand(1, 3);
  8. $_DB = $db[$random];
  9. }
  10.  
  11. $_DB = new PDO('..');
  12. $_DB->query('...');
  13. chaos();
  14. $_DB->query('...');
  15. chaos();
  16. $_DB->query('...');
  17. ?>

Wiem, że przykład jest naciągany, ale dokładnie pokazuje jak "bezpieczne" są zmienne globalne. Uwierz mi, że zawsze, kiedy inna osoba dobiera się do kodu istnieje prawdopodobieństwo, że zrobić coś podobnego, lecz nie w tak dobitny sposób.

Czekam tylko, aż ustosunkujesz się do mojego pytania z testami smile.gif


--------------------
Go to the top of the page
+Quote Post
NuLL
post 16.07.2006, 11:55:49
Post #16





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Cytat
Po drugie zarowno $_SYS jak i $_DB sa uzywane tylko przez cms i nikt niema do nich dostepu oprucz samego cms-u.

LOL
  1. <?php
  2. $GLOBALS['_SYS']=null;
  3. $GLOBALS['_DB']=null;
  4. ?>

Dopisze sobie w jakims module ( o ile CP bedzie modulowy tongue.gif ) czy szablonie i caly Twoj CMS mozna sobie.... ( dopisac samemu wg wlasnej opinii )

@Ludvik - dobre smile.gif Ten temat niedlugo bedzie mozna przerzucic do dzialu Humor winksmiley.jpg

Ten post edytował NuLL 16.07.2006, 11:57:21


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
Vomit
post 16.07.2006, 12:08:49
Post #17





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

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


NuLL, nie krzycz tylko spokojnie wyjasniaj winksmiley.jpg

Zmienne globalne sabotuja hermetyzacje i głownie o to chodzi. Nie jest to zgodne z aspektami programowania OOP, staja sie przyczyna smietniku w kodzie. Postronny programista nie wie skad nagle dana zmienna sie wziela. Zmienne globalne sa nie tylko omijane z daleka w php ale w kazdym innym jezyku programowania.

Oczywiscie sa tacy ktorzy korzystaja z nich... na wlasna odpowiedzialnosc, ja z takim kodem nie chcialbym pracowac.
Go to the top of the page
+Quote Post
Strzałek
post 16.07.2006, 12:23:52
Post #18





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


Cytat
"Krowa, która dużo ryczy, mało mleka daje"


Jak dla mnie eZ to: "Krowa, która dużo mleka daje".

A globale z reguły stwarzają dużo kłopotów...

Ten post edytował Strzałek 16.07.2006, 12:25:17


--------------------
Go to the top of the page
+Quote Post
tiraeth
post 16.07.2006, 12:42:01
Post #19





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


Gdyby globale były super fajne i bezpieczne, to twórcy php nie ustawialiby ich domyślnie na OFF smile.gif

@nasty_psycho: No to fajne CMSy piszesz, bez możliwości rozbudowy... i jeszcze uważasz, że TYPO3 jest lepsze od eZ Publish :| Poprostu gratuluję biggrin.gif
Go to the top of the page
+Quote Post
nasty
post 16.07.2006, 13:03:14
Post #20





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Sa mozliwosci rozbudowy nawet b. duzo jest ok 10 klas do pracowania z rozszezeniami.
ALE:
Jak kots robi extension to nie bedzie chyba wysadzal sobie cms-u albo hackowac. Bedzie caly dokument o tym jak pisac dodatki do cms-u i tam bedzie jasno napisane zeby tych zmiennych nie uzywac.

@Ludvik: tak to jest naciagane i to bardzo tongue.gif, to samo mozna zrobic z kazda zmienna. a $_DB nie jest zmienna typu array, ja w cp uzywam tylko ADO i nic innego
@Strzalek: to nie bylo o eZ, bo eZ jest bardzo dobry, tylko o NuLL.
@tiraeth: nie chce sie powtarzac ale moj cms ma rozbudowane mozliwosci podczepiania extension-ow i ustalania ich rodzaju jak np. Startup, filter czy content i wiele innych.
@NuLL: z tego co widze jak myslisz o budowie modulow to masz sklonnosci samobujcze tongue.gif
-----------
no i wedlug was jak mozna w alternatywny sposob dla kazdej klasy / funkcji dac mozliwosc korzystania z $_DB ? zeby nie bylo balaganu i w kazdej klasie miec public $dblink.

pozdrawiam

Ten post edytował nasty_psycho 16.07.2006, 13:03:51
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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 Wersja Lo-Fi Aktualny czas: 15.06.2025 - 06:11