Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Referencja w php 4.3.x vs 4.4.x vs. 5.0.x vs
sztosz
post
Post #1





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

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


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


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
ActivePlayer
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


moze tam cos przeczytasz: http://ez.no/community/articles/reference_issues
Go to the top of the page
+Quote Post
Sh4dow
post
Post #3





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


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.


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
sztosz
post
Post #4





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

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


@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


--------------------
Go to the top of the page
+Quote Post
ikioloak
post
Post #5





Grupa: Zarejestrowani
Postów: 416
Pomógł: 0
Dołączył: 8.01.2004

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


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'

Ten post edytował ikioloak 12.01.2006, 20:06:33
Go to the top of the page
+Quote Post
sztosz
post
Post #6





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

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


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


--------------------
Go to the top of the page
+Quote Post
dtb
post
Post #7





Grupa: Zarejestrowani
Postów: 476
Pomógł: 1
Dołączył: 5.11.2005
Skąd: Bieruń city

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


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)


--------------------
Go to the top of the page
+Quote Post
bigZbig
post
Post #8





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


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


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
sztosz
post
Post #9





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

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


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.


--------------------
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: 20.08.2025 - 18:05