Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nazwa klasy po której dziedziczę.
Forum PHP.pl > Forum > PHP > Object-oriented programming
sparr0w
Jako, że jest to mój pierwszy post, to witam wszystkich serdecznie.

Mam do was kochani pytanie. Otóż w pewnym celu, potrzebuje możliwości dziedziczenia po różnych klasach w zależności od sytuacji. Próbowałem już czarować ze zmiennymi, stałymi, etc., interpreter nie daje niestety za wygraną. W skrócie, chodzi mi o rozwiązanie takiej (błędnej z punktu widzenia interpretera) sytuacji:

  1. $dziedzicz_po_mnie = 'MojaKlasaRaz';
  2. class MojaKlasaDwa extends $dziedzicz_po_mnie {}


Odpowiada mi zarówno rozwiązanie ze zmienną, jak i stałą, nie ma to dla mnie znaczenia. Po prostu na podstawie wpisu w configu chciałbym dziedziczyć po różnych klasach.
Dzięki serdeczne i pozdrawiam.
Ociu
Witamy !
Nie da się tak jak chcesz zrobić.
Jedyne co możesz zrobić to:

  1. class Child
  2. {
  3. private $parent;
  4.  
  5. public function __contruct($parent)
  6. {
  7. $this->parent = $parent;
  8.  
  9. //potem jechac tak jak teraz
  10. }
  11. }


i w zależności od tego co tam potrzebujesz:
  1. $child = new Child($utworzony_obiekt_nadany_z_configa);
  2. // lub
  3. $child = new Child(new $nazwa_klasy_nadana_w_configu() );
sparr0w
Ale czy wtedy Child odziedziczy zmienne i metody z Parent? Chyba nie... A o to mi właśnie chodzi.
Crozin
Napisz co chcesz osiągnąć / jaki problem rozwiązać / czemu to ma służyć. Nakierujemy Cię na prawidłowe rozwiązanie, bo to co teraz próbujesz zrobić - pomijając fakt, że jest niemożliwe - jest pod każdym względem złe.
sparr0w
OK! Zatem jest tak.

Mam stworzoną klasę do obsługi MySQL'a
  1. class Application_DB_MySQL implements Application_DB_Interface {}


ale powiedzmy, że mam jeszcze klasy do obsługi innych baz danych, np:
  1. class Application_DB_MSSQL implements Application_DB_Interface {}

  1. class Application_DB_PGSQL implements Application_DB_Interface {}


etc.

Teraz, mocą mi daną wink.gif, chcę skorzsystać z tej klasy, ale NIE w ten sposób:
  1. $db = new Application_DB_MySQL();


Nie chcę tego robić też tak:
  1. $dbClassName = 'Application_DB_' . CFG_DB_TYPE;
  2. $db = new Application_DB_MySQL();


Zamiast tego, chcę się odwołać do klasy, która dynamicznie, na podstawie configa odpali klasę włąściwą dla odpowiedniej bazy danych, robiąc tak:
  1. $db = new Application_DB_Default();


Wymyśliłem to tak, że Application_DB_Default będzie pustą, lub prawie pustą klasą, która będzie dziedziczyć absolutnie wszystko po klasie dla odpowiedniej, ustalonej na podstawie CFG_DB_TYPE bazy danych.
Fifi209
Interface + Wzorzec Fabryka (Factory)
sparr0w
Cytat(Fifi209 @ 10.09.2011, 16:35:01 ) *
Interface + Wzorzec Fabryka (Factory)


Bóg Ci zapłać dobry człowieku! W kodzie. Albo w PLNach. I w zdrowiu. I w czym jeszcze chcesz! Dzięki! Pozdrawiam!
zajonc
  1. class t1
  2. {
  3. function test ()
  4. {
  5. echo "test 1\n";
  6. }
  7. }
  8.  
  9. class t2
  10. {
  11. function test ()
  12. {
  13. echo "test 2\n";
  14. }
  15. }
  16.  
  17.  
  18. $klasa = 't' . rand ( 1, 2 );
  19.  
  20. eval ( "class tt extends $klasa {}" );
  21.  
  22. $o = new tt ();
  23. $o->test ();
CuteOne
W ten sposób to ja z krowy mogę zrobić wieloryba... tylko jaki w tym sens (pomijając wrzucanie całego kodu klasy tt do eval)questionmark.gif
zajonc
udowodnij wink.gif
Fifi209
Dałem już autorowi słuszne rozwiązanie, nie wiem po co dalej drążycie temat, w dodatku z evalem? lol2
Kedan
Słusznym rozwiązaniem byłoby też PDO.

A nawiązują do tematu. Ogólnie rzecz biorąc, to co chciałeś z początku osiągnąć dziedziczeniem, powinno się zrobić przy pomocy agregacji:
  1. class DB implements iDB {
  2.  
  3. private $__driver;
  4.  
  5. public function __construct($driver_) {
  6. switch($driver_) {
  7. case 'MySQL':
  8. $this->__driver = new DB_MySQL();
  9. break;
  10. case 'PostgreSQL':
  11. $this->__driver = new DB_PSQL();
  12. break;
  13. default:
  14. die('Unknown database driver');
  15. break;
  16. }
  17. }
  18.  
  19. public function some_action($args_) {
  20. return $this->__driver->some_action($args_);
  21. }
  22.  
  23. }
  24.  
  25. class DB_MySQL implements iDB {
  26. //...
  27. }
  28.  
  29. class DB_PSQL implements iDB {
  30. //...
  31. }

lub, jak pisał Fifi209, za pomocą wzorców konstrukcyjnych.
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.