Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zmiana metody klasy jeśli istnieje
Forum PHP.pl > Forum > Przedszkole
sannin
Witam,

napisałem cms który ma tam jakieś moduły i są one ofertą podstawową. Użytkownicy zakładając konta pracują na tych samych plikach, ale osobnych bazach. Jednak są użytkownicy którzy potrzebują jakieś dodatkowe funkcje. Zrobiłem tak po to, żeby uniknąć po tysiąc krotnego poprawiana tych samych plików w razie wystąpienia błędu. Ale wracając do tematu, jest użytkownik który chcę dodatkową funkcję... całość jest napisana obiektowo. W podstawowym pakiecie powiedzmy jest dodawanie artykułów i jest to klasa Artykuly metoda dodaj. Pewien użytkownik chcę mieć możliwość dodawania razem z treścią zdjęć. Wymyśliłem coś takiego w katalogu modifications są podkatalogi user1, user2 z zmodyfikowanymi plikami. Teraz tak w pliku podstawowym Artykuly.Controller.php mamy:

  1. Class Artykuly {
  2. public function dodaj() {
  3. // kod
  4. }
  5.  
  6. public function dodaj() {
  7. // kod
  8. }
  9. }


w pliku modification/users1/Artykuly.Controller.php mamy:

  1. Class Artykuly {
  2. public function dodaj() {
  3. // inny kod
  4. }
  5. }
  6.  


Jak zrobić teraz żeby w klasie podstawowej zmieniła się tylko funkcja dodaj? Czy może ktoś zna jakieś inne lepsze rozwiązanie?
marcio
Po prostu sprawdzaj czy user ma plik: modification/users1/Artykuly.Controller.php jesli go ma zmienasz kontroler i tyle zrob to na podstawie interfejsow i api bd to samo.
sannin
Akurat to wiem tylko nie chcę znów przepisywać całego pliku, a ewentualnie metodę. Możesz powiedzieć mi coś więcej na temat interfejsów i api?
marcio
Nie musisz przepisywac calego pliku skoro: modification/users1/Artykuly.Controller.php to jest jakis dodatek to mozesz zrobic tak kazdy dodatek jak bedziesz pisal ma dziedziczy z klasy podstawowej czyli w tym przypadku:
Klasa podstawowa: Artykuly
Klasa rozszerzajaca: Artykuly ale jest inna sciezka pliku bo modification/users1/Artykuly.Controller.php.

Czyli teraz jak masz kontroler modification/users1/Artykuly.Controller.php includuj do niego glowna klase kontrolera Artykulow po czym robisz:

  1. class AddonsArtykuly extends Artykuly {
  2.  
  3. public function dodaj() {
  4.  
  5. // rozszerzasz funkcjonalnosci funkcji dodaj a reszta funckji zostaje taka sama.
  6.  
  7. }
  8.  
  9. }

Teraz przed utworzeniem obiektu artykuly i wywolania metody sprawdzasz czy istnieje plik: modification/users1/Artykuly.Controller.php jesli tak includujesz go i inicjuesz ta sama klase z sufix'em Addons.

Rozumiesz?To najprostszy sposob jaki przychodzi mi do glowy.
Crozin
W modyfikacje/uzytkownik_1/abc.php:
  1. <?php
  2.  
  3. class u1Artykuly extends Artykuly{
  4. //tutaj nadpisujesz jakies metody
  5. }
A autoloader niech zadba o to by w przypadku, gdy istnieje wczytywany był plik z modyfikacje/*

EDIT: uprzedzony smile.gif
sannin
Myślałem nad czymś takim, ale czy w takim wypadku metoda zostanie zamieniona? Nie wystąpi coś w rodzaju przeciążenia metody i sam w końcu nie będę wiedział która się wywoła?
marcio
Nie poprostu tym sposobem mozesz rozszerzac funkcjonalnosc danej metody lub dodawac nowe.

A po co ty masz wiedziec ktora sie wywola to ma wiedziec twoj skrypt poprostu jesli ktos chce dodatkowa funkcjonalnosc instaluje sobie ten addons a twoj kod wykonuje odpowiedni kontroler i tyle
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.