Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z metodami Parenta
Forum PHP.pl > Forum > PHP > Object-oriented programming
mkozak
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??
nospor
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
legorek
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.
mkozak
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??
nospor
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. ?>
mkozak
No to może inaczej zapytam - jak przeciążyć nazwę metody w PHP??

Czy ktoś wie??
nospor
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
batman
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.
Sedziwoj
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...
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.