Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dziedziczenie po klasie abstrakcyjnej
Forum PHP.pl > Forum > PHP > Object-oriented programming
squid
jest taki kod, dla uprosczenia skopiowany z ksiazki ale podobny do mojego przypadku

  1. <?php
  2. abstract class Database {
  3.  
  4.     abstract public function connect( );
  5.  
  6.     abstract public function query( );
  7.  
  8.     abstract public function fetch( );
  9.  
  10.     abstract public function close( );
  11.  
  12. }
  13. ?>


  1. <?php
  2. class MySQL extends Database {
  3.  
  4.     protected $dbh;
  5.  
  6.     protected $query;
  7.  
  8.  
  9.  
  10.     public function connect($server, $username, $password) {
  11.  
  12.         $this->dbh = mysql_connect($server, $username, $password);
  13.  
  14.     }
  15.  
  16.  
  17.  
  18.     public function query($sql) {
  19.  
  20.         $this->query = mysql_query($sql, $this->dbh);
  21.  
  22.     }
  23.  
  24.  
  25.  
  26.     public function fetch( ) {
  27.  
  28.         return mysql_fetch_row($this->query, $this->dbh);
  29.  
  30.     }
  31.  
  32.  
  33.  
  34.     public function close( ) {
  35.  
  36.         mysql_close($this->dbh);
  37.  
  38.     }
  39.  
  40. }
  41. ?>


kiedy zainkluduje obie klasy do skryptu otzymuje komunikat:

Fatal error: Declaration of MySQL::connect() must be compatible with that of Database::connect() in 2.php on line 40

kiedy zmienia klase abstrakcyja na:
  1. <?php
  2. abstract class Database {
  3.  
  4.     abstract public function connect( $server, $username, $password);
  5.  
  6.     abstract public function query( $sql);
  7.  
  8.     abstract public function fetch( );
  9.  
  10.     abstract public function close( );
  11.  
  12. }
  13.  ?>

bledu nie ma, czy to znaczy ze atrybuty metody abstrakcyjnej musza sie zgadzac z atrybutami metody dziedziczacej?
bela
Tak smile.gif
squid
no normalnie nie wnioslbym sprzeciwy ale powyzszy przyklad skopiowalem z ksiazki: Upgrading to php 5. Taki blad w ksiazce?
co sie na tym swiecie dzieje winksmiley.jpg
thnx
SongoQ
Cytat
Abstrakcja wskazuje natomiast nie tylko jakie funkcje mozemy wywolac na obiekcie ale tak w jaki sposob mamy ta funkcje wywolac (z jakimi argumentami) oraz co powinnismy otrzymac spowrotem (okreslony typ danych - w php5 nie ma czegos takiego).


Ok, jesli to prawda co piszesz to skad sie wzial blad?? Czyli jednak php5 dziala tak jak powinien, musisz zdeklarowac w klasie abstrakcyjnej wszystkie parametry.


Cytat
no normalnie nie wnioslbym sprzeciwy ale powyzszy przyklad skopiowalem z ksiazki


Bledy sie zdazaja, a najgorsze jest to ze w manualach i w ksiazkach. W ksiazce do Postgresa "PostgreSQL - praktyczny przewodnik" autor/tlumacz tak sie rozpedzil z tlumaczeniem ze przetlumaczyl kod sql.
NuLL
@seraf - a czy ideą interfejsu jest brak instancji również questionmark.gif Czy pomylilem z Services...
DeyV
Pytanie wydaje mi się nieco nie przemyślane.
Jak można wyobrazić sobie instancję interfejsu, czyli takiej klasy, która nie ma żadnego "ciała" ?
bela
Cytat(NuLL @ 2005-03-24 21:02:49)
@seraf - a czy ideą interfejsu jest brak instancji również questionmark.gif Czy pomylilem z Services...

Dla mnie ideą interfejsu jest wymuszenie określonego intejfejsu dry.gif (Głupio to brzmi ;])
Np piszemy sobie klasę do obsługi bazy danych i dajemy możliwość rozszerzania o kolejne sterowniki dla różnych baz, wtedy pisze jakiś interfejs dla tych sterowników i mamy pewność, że te metody będą zaimplementowane smile.gif
Imperior
W interfejsach też podaje się listę argumentów! Interfejs jest właśnie po to, aby można było sprecyzować co ma klasa!
bela
Cytat(serafin @ 2005-03-25 09:58:12)
Interfejs w tym przypadku jest tylko lista metod ktore musimy zaimplementowac a Abstrakcja to jak je musimy zaimplementowac (lacznie z lista argumentow)

serafin, zobacz co się stanie jak zaimplementujesz w ten sposób interfejs
  1. <?php
  2. interface IFoo {
  3.  public function bar($foo);
  4. }
  5.  
  6. class Foo implements IFoo {
  7.  publuc function bar() {}
  8. }
  9. ?>


winksmiley.jpg
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.