Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Referencja w php 4.3.x vs 4.4.x vs. 5.0.x vs
Forum PHP.pl > Forum > PHP
sztosz
OStatnio czytałem że zminił się w php 4.4 sposób przekazywania obiektów i innych danych poprzez referencję i na przykład dlatego są problemy z mojavi (mi osobiście, jak i paru innym osobą właśnie z powodu referencji się wywala na php 4.4.1). Podobno jest też jakaś zmiana w 5.1 w stosunku do 5.0

Na czym polegają te zmiany 4.4 w stosunku do 4.3 ? A jakie w 5.1 w stosunku do 5.0?

I teraz:

Mam sobie obiekt $DB który jest połaczeniem opartym o AdoDB z bazą MySQL i chce go przekazać jakiejś klasie, w jaki sposób to zrobić najefektywniej (najszybciej i najmniej zasobów zużywając? Chodzi mi o php 4.1 (serwer hostingowy takowe posiada a do przesiadki się nie szykuje winksmiley.jpg ), ale bardzo chętnie przeczytam jak to robić w zależności od wersji php smile.gif

Tak:

  1. <?php
  2.  
  3. class Obiekt {
  4. var $DB = null;
  5.  
  6. //konstruktor
  7. function Obiekt(&$DB) {
  8.  
  9. $this->DB = $DB;
  10. //Reszta ciał matody
  11. }
  12. }
  13.  
  14. $DB = ADONewConnection('MYSQL');
  15.  
  16. $obiekt = new Obiekt($DB)
  17.  
  18. ?>


Czy moze tak, jak mi Zend Studio 5.1 podpowiada swoim Code Analyzer:

  1. <?php
  2.  
  3. class Obiekt {
  4. var $DB = null;
  5.  
  6. //konstruktor
  7. function Obiekt($DB) {
  8.  
  9. $this->DB = $DB;
  10. //Reszta ciał matody
  11. }
  12. }
  13.  
  14. $DB = ADONewConnection('MYSQL');
  15.  
  16. $obiekt = new Obiekt($DB)
  17.  
  18. ?>


Różnuica jest w "function Obiekt(&$DB)"

Akurat w tym moim małym projekcie to i tak nie ma znaczenia bo stosunek mocy obliczeniowej posiadanej do potrzebnej jest w najgorszym wypadku dużo wiecej niż wystarczający.
Chciałbym jednak nauczyć się dobrych nawyków smile.gif
ActivePlayer
moze tam cos przeczytasz: http://ez.no/community/articles/reference_issues
Sh4dow
Z tego co wiem od wersji 5.0 referencje sa automatyczne w obietkach. Albo jakos tak.
Jesli natomiast chcemy zrobic kopie obiektu to chyba bylo stworzone cos takiego jak __clone()w php5 oba przyklady podane przez ciebie powinny dzialac tak samo, roznic powinna byc jedynie przy php4.
sztosz
@ActivePlayer: Już wiem o co w takim razie chodziło z tym zamieszaniem z referencją smile.gif Dziękuję.

Co do moich przykładów, to wiem że w PHP4 jest róznica.

Bo pierwszy, zakładając że się nie mylę, przekazuje dany obiekt przez referencję. Czyli nadal mamy jeden obiekt. Mniejsze zużycie pamieci, zamiast drugiego obiektu mamy jedynie referencję.

Natomiast w drugim robimy kopię obiektu. Czyli mamy dwa obiekty. Większe zuzycie pamięci. I w tym miejscu Zend Studio mi mówi że, póki nie zmieniamy obiektu (czyli nie zmienieamy jego atrybutów) to o wiele lepiej jest skopiować dany obiekt, zamiast go podawaćprzez referencję. Dlaczego? Zend mówi, że jest to o wiele szybsze. Czy to prawda?

I jak to odnieść do takich Obiektów jak ten z AdoDB (sam nie wiem co on dokladnie zawiera winksmiley.jpg ), bo ja niestety nie mam żadnego doświadczenia w tym sad.gif
ikioloak
Zobacz czy masz Zend Studio ustawione na php4 czy php5.
Bo dla php4:
  1. <?php
  2.  
  3. function Obiekt(&$DB) {
  4.  
  5.         $this->DB = $DB;
  6.         //Reszta ciał matody
  7.     }
  8.  
  9. ?>

Odpowiednikiem w php5 jest:
  1. <?php
  2.  
  3. function Obiekt($DB) { //tutaj tez jest przekazywane przez referncje!
  4.  
  5.         $this->DB = $DB;
  6.         //Reszta ciał matody
  7.     }
  8.  
  9. ?>

Gdy przekazujemy obiekty jako argument funkcji php5 automatycznie przekazuje jako referencje. Nie ma potrzeby stosowania &. Zwiazane jest to, tak mi sie przynajmniej wydaje, z tym ze w php5 wprowadzono inny mechanizm kopiowania obiektow, mianowicie 'clone'
sztosz
Co do różnic między 4.3 a 4.4 i 5.0 5.1 to już wiem o co chodzi, zwaracanie wartości i referencja, wszystko jest w linku od ActivePlayera.

Zend mam ustawiony na PHP4, tyle że nie o Zenda chodzi, ale o samą składnie języka. Co jest szybsze, referencja czy klonowanie? I czy warto poświęcać zasoby jeżeli klonowanie jest szybsze włąsnie dla tej szybkości?

Cały czas Mówimy o PHP4
dtb
to zalezy. jezeli masz strone ktora odwiedza n-tysiecy osob to zasoby sa super wazne. jak masz malo pamieci to na nic ci szybszy o kilka setnych sekundy skrypt (takie jest moje zdanie)
bigZbig
Cytat(sztosz @ 2006-01-12 20:51:49)
I w tym miejscu Zend Studio mi mówi że, póki nie zmieniamy obiektu (czyli nie zmienieamy jego atrybutów) to o wiele lepiej jest skopiować dany obiekt, zamiast go podawaćprzez referencję. Dlaczego? Zend mówi, że jest to o wiele szybsze. Czy to prawda?

Chyba na odwrót. Jesli nie zmieniamy obiektu to lepiej go przekazac przez referencje bo wtedy wciaz mamy ten sam niezmieniony obiekt wiec nie ma potrzeby tworzyc jego kopii. Natomiast jesli nasze dzialania na obiekcie pierwotnym prowadza do jego zmiany to lepiej go skopiowac, aby zachowac "orginal" - oczywiscie kosztem pamieci.

Moim zdaniem w Twoim przypadku lepiej zastosowac referencje chyba, ze w klasie zmieniasz konfiguracje obiektu np. wywołując
  1. <?php
  2. $this->DB->SetFetchMode(ADODB_FETCH_ASSOC);
  3. ?>
sztosz
Zend mi napisał:

QUOTE ("$DB is passed by reference without being modified (line X)
")
A variable is passed by reference but its value is not modified. Contrary to popular belief, this actualy reduces performance in most cases, so it's preerable to use standard pass-by-value behavior.[/quote]

Dlatego pytam się, czy to jest prawda?

Cytat("bigZbig")
Natomiast jesli nasze dzialania na obiekcie pierwotnym prowadza do jego zmiany to lepiej go skopiowac, aby zachowac "orginal"[...]


Przyznam sie że w PHP4 nie bawiłem się we wzorzec singleton, chociaz zapewne to by bylo najlepsze (ale kwestia samej semantyki języka, brak możliwości hermetyzacji mnie zniechęca). Nie mniej jednak jeżeli tworzę jakiś obiekt to wlaśnie kiedy chce go zmienić to podaje przez referencję, po to jest włąsnie ta referencja. A kiedy go nie będę zmieniać to sobie go "pass-by-value". A Zend jeszcze do tego wypisuje mi że tak nawet należy robić ze względu na szybkość.

I teraz kolejne pytanie powtórzę: czy Obiekty takie jak AdoDB powinno podawać się prze referencję, czy "pass-by-value"? Bo nie wiem czy w tym drógim przypadku nie tworzy się nowe połączenie z bazą danych etc.
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.