Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa, dziedzieczenie, singleton i interfejs - poprawność konstrukcji
Forum PHP.pl > Forum > PHP
atze_
Witam,

Mam następujący kod:

  1. <?php
  2. interface ContentInterface {
  3.    public function get_content_list($start, $offset);
  4. }
  5.  
  6. abstract class Content
  7. {
  8.    protected $_classname;
  9.    protected $_foto;
  10.    protected $_file;
  11.    protected $_movie;
  12.  
  13.    protected function __construct() {
  14.        $this->_foto = Fotosingleton();
  15.        $this->_file = Filesingleton();
  16.        $this->_movie = Moviesingleton();
  17.    }
  18.  
  19.    public function get_foto() {}
  20.  
  21. }
  22.  
  23. class Page extends Content implements ContentInterface
  24. {
  25.    private static $instance;
  26.  
  27.    protected function __construct() {
  28.        $this->_classname = 'page';
  29.        parent__construct();        
  30.    }
  31.  
  32.    public static function singleton() {
  33.        if (!isset(self$instance)) {
  34.            $c = __CLASS__;
  35.            self$instance = new $c;
  36.        }
  37.        return self$instance;
  38.    }
  39.  
  40.    public function __clone() {
  41.        trigger_error('Klonowanie zabronione.', E_USER_ERROR);
  42.    }
  43.  
  44.    public function get_content_list($start, $offset) {}
  45.    public function add($start, $offset) {}
  46.     public function edit($start, $offset) {}
  47.     public function view($start, $offset) {}
  48.     public function form($start, $offset) {}
  49.  
  50. }
  51. ?>


Klasa Page(jak i inne klasy np. News, Faq) dziedziczy po Content obsługę pobierania z bazy, uploadu nowych zdjęć, plików i załączników. W każdym module strona|aktualności|faq będzie można do treści strony dodać zdjęcia w galerii, załączniki i filmy, więc chce ograniczyc ilość kodu odpowiadającego za te czynności. Dodatkowo poprzez interfejs chce wskazać jakie wymagane przez moduł metody muszą znajdować się w klasie - tworzenie nowego modułu przez drugiego programistę.

Nie jestem pewien czy ta konstrukcja jest poprawna. Mógłby ktoś zerknąć.
Cysiaczek
W tym konkretnym przypadku ja bym umieścił metodę get_content_list() jako metodę abstrakcyjną w klasie abstrakcyjnej Content.
Ten kod jest... nieaktywny, bo użytkownik musi ręcznie zadeklarować, że implementuje interfejs ContentInterface. Co jeśli tego nie zrobi? Otóż nic - kod zadziała (i gdzieś tam dalej się wysypie).
Ewentualnie, jeśli zależy Ci na tym, aby interfejs pozostał jako osobny byt, proponuję następującą modyfikację
  1. <?php
  2. abstract class Content implements ContentInterface
  3. ?>


Pozdrawiam.
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.