Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [OOP] Pierwsze kroki
kitol
post
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


Witam, chcę sobie stworzyć rozszerzenie klasy mysqli. To znaczy chcę stworzyć nową klasę która dziedziczyłaby z mysqli wszystkie metody i właściwości, niektóre ich przeciążając (zastępując własnymi). Na przykład funkcję query chciałbym rozbudować o obsługę błedów. Z kodu programu wywoływana byłaby standardowo $mysqli->query(), ale miałaby być wykonywana moja funkcja. Pogrzebałem trochę w manualu i skleciłem coś takiego:
  1. <?php
  2. class ExtendClass extends mysqli
  3. {
  4. public $mysql;
  5.  
  6. function __construct()
  7. {
  8. $this->mysql= new mysqli('***', '***', '***', '***');
  9. print('konstruktor');
  10. }
  11.  
  12. function displayServ()
  13. {
  14. echo &#092;nExtending class\n';
  15. echo $this->mysql->server_info;
  16. }
  17. }
  18.  
  19. $mysqli = new ExtendClass();
  20. $mysqli->displayServ();
  21. echo "\n\n\".$mysqli->server_info;
  22. ?>

niestety nie działa ostatnia linia ($mysqli->server_info).

Warning: main(): Couldn't fetch ExtendClass in D:\WWW\mysql_test.php on line 21

Wygląda na to że moja klasa nie dziedziczy z oryginalnej mysqli. Co robię źle?

Ten post edytował kitol 13.02.2008, 11:47:59
Go to the top of the page
+Quote Post
em1X
post
Post #2





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Na starcie już źle pojmujesz rozszerzanie klas.
Dlaczego tworzysz pole mysql, któremu przypisujesz klasę potomną ?

Klasa ExtendClass sama w sobie staje się w tym przypadku klasą mysqli, jednak poszerzoną o nowe możliwości. Nie znam właściwości klasy mysqli, jednak prawidłowo tak to powinno wyglądać:

  1. <?php
  2. class ExtendClass extends mysqli {
  3.  public function __construct() {
  4. parent::__construct('***', '***', '***', '***');
  5. print &#092;"Konstruktor\";
  6.  }
  7.  
  8.  public function displayServ() {
  9. print &#092;"Poszerzona wersja: \n\";
  10. print $this->server_info;
  11.  }
  12. }
  13. ?>


Ten post edytował em1X 18.02.2008, 17:56:46


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #3





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

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


Cytat(em1X @ 18.02.2008, 17:56:31 ) *
Na starcie już źle pojmujesz rozszerzanie klas.
Dlaczego tworzysz pole mysql, któremu przypisujesz klasę potomną ?


Wiesz masz parę możliwości rozszerzania, dziedziczenie to jedna z nich, ale w tym przypadku chyba jest jedna z lepszych.
Tylko że ona nie pozwala zmienić Ci sygnatury metod (muszą mieć tą samą listę argumentów), a dzięki agregacji można to osiągnąć, tylko że to wymusza przepisanie wszystkich metod które mają być użyte co jest często niewygodne (ale mimo wszystko jak głównym powodem jest zmiana sygnatury co poniektórych funkcji to jest to jedyna opcja).

Jak jednak pisałem w tym przypadku raczej lepiej użyć tylko dziedziczenia i zrobić tak jak podałeś.


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