Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z metodami Parenta
mkozak
post
Post #1





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Są sobie 3 obiekty:

StdObj

Produkt

Produkt_extendent

dziedziczą jeden po drugim.

i teraz taka sytuacja - chcę zwrócić listę w pełni wypełnionych obektów z bazy

  1. <?php
  2. class Produkt extends StdObiekt{
  3. protected $produkt_id = -1;
  4. protected $produkt_nazwa = -1;
  5. protected $produkt_dostepnosc_id = -1;
  6. protected $produkt_typ_id = -1;
  7.  
  8. public function __construct($param = null){
  9. parent::__construct($param);
  10. }
  11.  
  12. public function __construct_from_assoc(array $t_prod){
  13. $this -> set('produkt_nazwa', $t_prod['produkt_nazwa']);
  14. $this -> set('produkt_data_dodania', $t_prod['produkt_data_dodania']);
  15. $this -> set('produkt_dostepnosc_id', $t_prod['produkt_dostepnosc_id']);
  16. }
  17.  
  18. public function dbPobierz($id = null){
  19.  
  20. if(isset($id)) $sql_id = 'WHERE produkt_id = ''.$id.''';
  21.  
  22. $sql = 'SELECT * FROM produkt '.$sql_id;
  23.  
  24. $t_produkt = getAssoc($sql);
  25.  
  26. $produkt = array_pop($t_produkt);
  27.  
  28. $this -> __construct_from_assoc($produkt);
  29.  
  30. return true;
  31. }
  32. }
  33.  
  34.  
  35. class Produkt_ext extends Produkt{
  36.  
  37. public $Produkt_ext_id = -1;
  38. public $Produkt_ext_nazwa = -1;
  39. public $Produkt_ext_opis = null;
  40. public $Produkt_ext_xml = null;
  41.  
  42. public $czy_jest_zestawem = 0;
  43. public $t_zestaw = array();
  44.  
  45. public function __construct($param = null){
  46. parent::__construct($param);
  47. }
  48.  
  49. public function __construct_from_assoc(array $t_param){
  50.  
  51. $this -> set('produkt_id', $t_param['produkt_id']);
  52.  
  53. $this -> set('Produkt_ext_id', $t_param['Produkt_ext_id']);
  54. $this -> set('Produkt_ext_nazwa', $t_param['Produkt_ext_nazwa']);
  55. $this -> set('Produkt_ext_opis', $t_param['Produkt_ext_opis']);
  56. $this -> set('Produkt_ext_xml', $t_param['Produkt_ext_xml']);
  57.  
  58. }
  59.  
  60. public function dbPobierz($id = null){
  61.  
  62. if(isset($id)) $sql_id = 'WHERE Produkt_ext_id = ''.$id.''';
  63.  
  64. $sql = 'SELECT * FROM Produkt_ext '.$sql_id;
  65.  
  66. $t_Produkt_ext = getAssoc($sql);
  67.  
  68. $Produkt_ext = array_pop($t_Produkt_ext);
  69.  
  70. $this -> __construct_from_assoc($Produkt_ext);
  71.  
  72. parent::dbPobierz($this->produkt_id);
  73.  
  74. if($this -> czy_jest_zestawem) $this -> pobierzElementyZestawu();
  75.  
  76. return true;
  77. }
  78. }
  79. ?>


no i jedziemy z koksem:

  1. <?php
  2. prod_ex = New Produkt_extendent();
  3.  
  4. prod_ex -> dbPobierz('1');
  5. ?>


No i jest dupa - bo w metodzie Produkt_ext -> dbPobierz() wywołuję parent::dbPobierz($this->produkt_id); a w dbPobierz() już nie wykonuje się __construct_from_assoc() z Produkt - tylko z Produkt_ext.

Nie mogę wrzucić do $Produkt->dbPobierz() zamiast $this -> __construct_from_assoc($produkt); dać parent no bo to nie logiczne i przestanie mi działać....

No any way.... to jakaś lipa....

W skrócie jeszcze raz

W poziomu Produkt_ext wywołuję parent::dbPobierz. W ciele klasy Produkt jest wywoływana metoda __construct_from_assoc (ale Produkt_ext też ma metodę __construct_from_assoc) no i wywołuje się ta z Produkt_ext a nie z Produkt.

Jakaś rada??


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
W poziomu Produkt_ext wywołuję parent::dbPobierz. W ciele klasy Produkt jest wywoływana metoda __construct_from_assoc (ale Produkt_ext też ma metodę __construct_from_assoc) no i wywołuje się ta z Produkt_ext a nie z Produkt.
Tak dziala dziedziczenie smile.gif
Jaka rada? Zastanow sie co to ma robic i zapisz inaczej. Za bardzo nie moge ci wiecej pomoc bo nie rozumiem Twojego toku myslenia


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
legorek
post
Post #3





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Myślę, że rozumiem o co chodzi koledze: chciałby aby wywołanie w klasie dziedziczącej konstruktora rodzica powodowało stworzenie instancji obiektu rodzica. Nie wiem tylko po co.


--------------------
Go to the top of the page
+Quote Post
mkozak
post
Post #4





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


Prosta sprawa

Wszystkie klasy mają wspólny interface.

Każda klasa ma takie same metody i każda działa w podobny sposób to ułatwia sprawę w pisaniu.

Teraz tak - StdObj i Produkt jest ok - ale w obiekcie Produkt_extend chciałbym przeciążyć metodę.

Niektóre produkty są złożone (zestaw, bądź ten sam produkt ma kilka opcji) więc powstaje odbiekt Produkt_ext.

Robimy to przez rozszerzenie Produkt_ext extends Produkt. No i teraz potrzebuję wyciągnąć z bazy kompletny produkt rozszerzony.
i teraz już w kodzie tworzę produkt_ext - z bazy wyciągam dane na temat rozszerzonego produktu, gdzie mam id produktu podstawowego (i w Produkt_ext -> dbPobierz chciałbym wypełnić atrybuty odziedziczone po Produkt danymi z bazy metodą która istnieje już w ciele bazy rodzica)

Wszystko było by dobrze, gdyby php zachował się w prawidłowy sposób.

Wywołując parent::dbPobierz - oczekuję, że wywołuję metodę rodzica - tak też się dzije, ale w dbPobierz rodzica wszystkie metody odwołują zachowują się tak jak by to był Produkt_ext, a nie Produkt.


  1. <?php
  2. public function dbPobierz($id = null){
  3.  
  4. if(isset($id)) $sql_id = 'WHERE Produkt_ext_id = ''.$id.''';
  5.  
  6. $sql = 'SELECT * FROM Produkt_ext '.$sql_id;
  7.  
  8. $t_Produkt_ext = getAssoc($sql);
  9.  
  10. $Produkt_ext = array_pop($t_Produkt_ext);
  11.  
  12. $this -> __construct_from_assoc($Produkt_ext);
  13.  
  14. [color="#FF0000"]parent::dbPobierz($this->produkt_id);[/color]
  15.  
  16. if($this -> czy_jest_zestawem) $this -> pobierzElementyZestawu();
  17.  
  18. return true;
  19. }
  20.  
  21.  
  22. class Produkt extends StdObiekt{
  23. protected $produkt_id = -1;
  24. protected $produkt_nazwa = -1;
  25. protected $produkt_dostepnosc_id = -1;
  26. protected $produkt_typ_id = -1;
  27.  
  28. public function __construct($param = null){
  29. parent::__construct($param);
  30. }
  31.  
  32. public function __construct_from_assoc(array $t_prod){
  33. $this -> set('produkt_nazwa', $t_prod['produkt_nazwa']);
  34. $this -> set('produkt_data_dodania', $t_prod['produkt_data_dodania']);
  35. $this -> set('produkt_dostepnosc_id', $t_prod['produkt_dostepnosc_id']);
  36. }
  37.  
  38. public function dbPobierz($id = null){
  39.  
  40. if(isset($id)) $sql_id = 'WHERE produkt_id = ''.$id.''';
  41.  
  42. $sql = 'SELECT * FROM produkt '.$sql_id;
  43.  
  44. $t_produkt = getAssoc($sql);
  45.  
  46. $produkt = array_pop($t_produkt);
  47.  
  48. [color="#FF0000"] $this -> __construct_from_assoc($produkt);[/color]
  49. return true;
  50. }
  51. }
  52. ?>


Drugi podkreślony fragment nie zachowuję się już ja w swoim ciele, ale $this nagle zaczyna się zachowywać jakby był Produkt_ext

$p = New Produkt_ext
$p -> dbPobierz() - w nim jest parent::dbPobierz() a w parent::dbPobierz jest $this->__construct_from_assoc() - i tu jest problem bo powinien się zachować jak parent::__construct_from_assoc(), a nie robi tego.

Innym OMINIĘCIEM problemu jest zrobienie __construct_from_assoc_ext() dla Produkt_ext, ale wtedy nie utrzymuję konwencji narzuconej przez interface i cała dbałość o porządek bierze w łeb.

Czy ktoś tu jest javoviec - i rozumie takie kwestie i ma jakiś pomysł na zapisanie takiej konstrukcji w PHP??


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Czy ktoś tu jest javoviec - i rozumie takie kwestie
Co ma piernik do wiatraka? W javie tak samo to zadziala.

Jak chcesz miec wywolanie funkcji z PRoduct to Ext tez musisz dac parent::
  1. <?php
  2. public function __construct_from_assoc(array $t_prod){
  3. parent::__construct_from_assoc($t_prod);
  4. $this -> set('produkt_nazwa', $t_prod['produkt_nazwa']);
  5. $this -> set('produkt_data_dodania', $t_prod['produkt_data_dodania']);
  6. $this -> set('produkt_dostepnosc_id', $t_prod['produkt_dostepnosc_id']);
  7. }
  8. ?>


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mkozak
post
Post #6





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


No to może inaczej zapytam - jak przeciążyć nazwę metody w PHP??

Czy ktoś wie??


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




PHP nie umozliwia przeciążania metod. To nie java winksmiley.jpg
W php za to można jako parametr przekac rozne typy danych. Na tej podstawie mozesz kombinowac smile.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(mkozak @ 10.06.2008, 10:12:15 ) *
No to może inaczej zapytam - jak przeciążyć nazwę metody w PHP??

Czy ktoś wie??



Cytat(nospor @ 10.06.2008, 10:23:09 ) *
PHP nie umozliwia przeciążania metod. To nie java winksmiley.jpg
W php za to można jako parametr przekac rozne typy danych. Na tej podstawie mozesz kombinowac smile.gif


Przeciążanie samo w sobie nie jest możliwe w PHP, jednak jest kilka funkcji, które mogą "emulować" takie zachowanie:
func_get_arg
func_num_args
func_get_args
Dzięki temu możesz przekazywać do metody dowolną ilość argumentów o różnych typach. Jednak z doświadczenia wiem, że rozwiązanie nie należy do najprzyjemniejszych w użyciu.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #9





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Już nawet przyjmując jeden argument o różnych typach (np. id rekordu, lub AR ) ciężko się czyta kod, czy też go dokumentuje.
(choć stosując pewną strategię można to zrobić nawet w miarę ładnie)

No cóż ale na przeciążanie raczej nie ma co liczyć w PHP...


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
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: 22.08.2025 - 05:33