Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Metody w klasie abstrakcynej
Forum PHP.pl > Forum > PHP > Object-oriented programming
Largo
Witam,

Mam pewną klasę do obsługi baz danych, nie tylko MySQL. Właśnie ją piszę, ale pojawił mi się pewny problem. Dodałem atrybuty klas, metody abstrakcyjne dla odpowiednich implementacji, ale tu pojawia się mój problem. Konstruktor wywołuje 2 metody abstrakcyjne connect() i select_db(). Mimo to, chcę dodać do tej klasy pewne metody, ale nie abstrakcyjnej i tu pojawia się problem. Załóżmy, mam metodę getDatabaseType($name) z parametrem nazwy i przy wywołaniu jej, oczywiście po odziedziczeniu po MySQL mogę ją użyć? Podam na przykładzie.

  1. <?php
  2. $driver = getDatabaseType($type);
  3. $db = new $driver();
  4. ?>


A $driver to typ, który pobieram z pliku konfiguracyjnego. A getDatabaseType jest w klasie abstrakcyjnej. A klasy abstrakcyjnej chyba nie da się wywołać, z tego co się orientuję :-) Czy tak da się zrobić? Czy w klasie dziedziczącej po Database ( Abstrakcyjnej ) mogę posługiwać się jej metodami?

Pozdrawiam,
Largo
MMPrime
Oczywiście że możesz, choć w tym wypadku zainteresowałbym się natywnym PDO do obsługi bazy danych.
merk
Można wywołać metody statyczne klasy abstrakcyjnej jeśli są publiczne :-).

W klasie dziedziczącej po abstrakcyjnej możesz posługiwać się metodami z klasy abstrakcyjnej o ile są widoczne w klasie dziedziczącej (private, protected, public).
Sedziwoj
@merk
chyba powinieneś wymienić tylko public, protected...

A swoją drogą, mam wrażenie, że autor, nie do końca wie jak się w ogóle pisze, może by poczytał jakieś przykłady, jak się coś robi, bo fragment który zaprezentował, nic nie mówi.
merk
Racja rozpędziłem się.
Strzałek
Cytat(merk @ 24.04.2008, 00:23:01 ) *
Racja rozpędziłem się.

Zaraz, zaraz, powoli.

Cytat
A getDatabaseType jest w klasie abstrakcyjnej.


Zrozumiałem że getDatabaseType jest metodą jakiejś klasy abstrakcyjnej. Nie możesz jej w takim razie używać jako funkcji tak jak podałeś w przykładowym kodzie. Nawet gdyby to nie była klasa abstrakcyjna to nie można tak zrobić. Aby wywołać jakąś metodę jakiejś klasy musisz utworzyć jej egzemplarz.

Metodę jakiejś klasy (zwykłej lub abstrakcyjnej), bez tworzenia egzemplarza tej klasy, możesz wywołać tylko i wyłącznie wtedy kiedy jest ona statyczna.

A w tak w ogóle to ja bym to napisał tak:

  1. <?php
  2.  
  3. $dbDriver = DatabaseFactory::getDriverInstance($driverName, $parameters);
  4. $dbDriver -> connect();
  5. $dbDriver -> query()
  6. // ...
  7. ?>
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.