Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nazwa klasy po której dziedziczę.
sparr0w
post 9.09.2011, 23:32:47
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2011

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


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.

Ten post edytował sparr0w 10.09.2011, 05:14:57
Go to the top of the page
+Quote Post
Ociu
post 10.09.2011, 07:44:47
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




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() );
Go to the top of the page
+Quote Post
sparr0w
post 10.09.2011, 11:40:21
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2011

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


Ale czy wtedy Child odziedziczy zmienne i metody z Parent? Chyba nie... A o to mi właśnie chodzi.
Go to the top of the page
+Quote Post
Crozin
post 10.09.2011, 12:02:02
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
sparr0w
post 10.09.2011, 15:30:42
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2011

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


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.
Go to the top of the page
+Quote Post
Fifi209
post 10.09.2011, 15:35:01
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Interface + Wzorzec Fabryka (Factory)


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
sparr0w
post 10.09.2011, 16:10:39
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.09.2011

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


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!
Go to the top of the page
+Quote Post
zajonc
post 10.09.2011, 16:53:25
Post #8





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 18.01.2010

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


  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 ();


Ten post edytował zajonc 10.09.2011, 16:57:30
Go to the top of the page
+Quote Post
CuteOne
post 10.09.2011, 16:57:32
Post #9





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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
Go to the top of the page
+Quote Post
zajonc
post 11.09.2011, 01:22:51
Post #10





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 18.01.2010

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


udowodnij wink.gif
Go to the top of the page
+Quote Post
Fifi209
post 11.09.2011, 18:47:43
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Dałem już autorowi słuszne rozwiązanie, nie wiem po co dalej drążycie temat, w dodatku z evalem? lol2


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Kedan
post 30.09.2011, 09:57:35
Post #12





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 20.07.2007

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


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.

Ten post edytował Kedan 30.09.2011, 10:05:53
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 Wersja Lo-Fi Aktualny czas: 13.06.2025 - 04:18