搜索关于Php中抽象类使用的确认或指导

搜索关于Php中抽象类使用的确认或指导,php,inheritance,abstract-class,abstraction,Php,Inheritance,Abstract Class,Abstraction,基本上,我在寻找关于我这周在工作中创造的东西的反馈或指导。问题是我有两种类型的文档上传。这两种类型都是共享的方法,如upload、IsUpload、move等。但在某些情况下,它们都具有独特的功能 所以我认为处理这个问题的最好方法是创建一个包含公共功能的抽象类和两个扩展基本抽象类的独立类,以便继承公共功能 因此,我: abstract class Upload { protected $_id; protected $_name; protected $_dbTable; abstr

基本上,我在寻找关于我这周在工作中创造的东西的反馈或指导。问题是我有两种类型的文档上传。这两种类型都是共享的方法,如upload、IsUpload、move等。但在某些情况下,它们都具有独特的功能

所以我认为处理这个问题的最好方法是创建一个包含公共功能的抽象类和两个扩展基本抽象类的独立类,以便继承公共功能

因此,我:

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=newupload($id)?

您正在扩展的类不会调用parent::\uu构造(),因此抽象的\uu构造不会有任何区别

您正确地使用了抽象类;它们是由共享公共功能和/或具有相同功能但实现方式不同的其他类构建的基类


抽象类是为其他类提供公共功能和结构的基础。

任何类都应该提供单一类型的功能(单一责任原则,例如:)

上载类只能处理上载。如果没有更多的代码,我从您的文字中嗅到一个过度功能化的类,它试图完成上传和文档特殊任务


所以在这样做之前,您应该很好地定义这些类将要做什么。那些文档的特殊功能真的与上传的实际行为相关吗?

哦,上面的逻辑已经从内存中重新键入,所以忽略任何语法错误。嗯,我明白你的观点,但我的文档类确实需要使用上传方法。文档方法基于上传的文件创建一个记录,并提供访问施工记录数据的功能。然后,应该采用
组合
模式。您可以从文档类调用upload类。