Поиск какого-либо подтверждения или руководства по использованию абстрактного класса в Php

По сути, я ищу отзывы или рекомендации по поводу чего-то, что я создал на этой неделе на работе. Проблема заключалась в том, что у меня было два типа загрузки документов. Оба этих типа имеют общие методы, такие как загрузка, isUploaded, перемещение и т. д. Но в некоторых случаях они оба имели уникальную функциональность.

Поэтому я подумал, что лучшим подходом к решению этой проблемы будет создание абстрактного класса, который содержит общую функциональность и 2 отдельных класса, которые расширяют базовый абстрактный класс, чтобы наследовать общую функциональность.

Так что я:

abstract class Upload {

 protected $_id;
 protected $_name;
 protected $_dbTable;

 abstract public function create(Filter $filter) {}
 abstract public function update(Filter $filter) {}

 public function __construct($id){
  if(!is_null($id)){
   $class = new get_called_class();
   return new $class($id);
  }
 }

 protected function upload(){
  //Code implemented
 }

 protected function isUploaded(){
  //Code implemented
 }

 protected function move(){
  //Code implemented
 }

}

Class Book_Upload extends Upload {

 $dbTable = 'book';

 public function __construct($id){
  //Database stuff to obtain record information
  //Set protected member variables
  $results = $databaseCall();
  $this->_id = $results['id'];
  $this->_name = $results['name'];
 }

 public function create(Filter $filter) {
  //Code implemented
 }

 public function update(Filter $filter) {
  //Code implemenetd
 }

 //Other unique functions

}

Class Magazine_Upload extends Upload {

 $dbTable = 'magazine';

 Same as Booking_Upload but with additional functionality
 plus abstract methods

}

Мой вопрос: правильно ли я использую абстрактные методы? Я следовал правильному пути. Кроме того, я не уверен, что мне нужна конструкция в абстрактном классе. Что, если кто-то попытается вызвать $upload = new Upload($id)?


person Community    schedule 12.11.2010    source источник
comment
О, приведенная выше логика была перепечатана по памяти, поэтому игнорируйте любые синтаксические ошибки.   -  person    schedule 12.11.2010


Ответы (2)


Любой класс должен предоставлять единый тип функциональности (принцип единой ответственности, пример: принцип единой ответственности — сложный пример?).

Класс загрузки должен иметь дело только с загрузками. Без дополнительного кода я чувствую запах чрезмерно функционального класса из ваших слов, который пытается выполнить как задачи загрузки, так и задачи, связанные с документом.

Поэтому, прежде чем идти по этому пути, вы должны хорошо определить, что эти классы будут делать. Действительно ли эти специфичные для документа функции связаны с фактическим актом загрузки?

person Halil Özgür    schedule 12.11.2010
comment
Хм, я понимаю вашу точку зрения, но мои классы документов должны использовать методы загрузки. Методы документа создают запись на основе загруженного файла и предоставляют функциональные возможности для получения доступа к данным записи о строительстве. - person ; 14.11.2010
comment
Тогда вам подойдет шаблон composition. Вы можете вызвать класс загрузки из классов документов. - person Halil Özgür; 15.11.2010

Вы расширяете класс, не вызывая parent::__construct(), поэтому абстрактная __construct не будет иметь никакого значения.

Вы правильно используете абстрактные классы; они являются базовыми классами, на основе которых должны создаваться другие классы, которые имеют общие функции и/или будут иметь ту же функциональность, но реализованы по-разному.

Абстрактные классы — это основа для построения, обеспечивающая общую функциональность и структуру для других классов.

person Ashley    schedule 12.11.2010