Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Pierwsze kroki
Forum PHP.pl > Forum > PHP > Object-oriented programming
kitol
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?
em1X
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. ?>
Sedziwoj
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ś.
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.