【发布时间】:2019-03-20 16:47:17
【问题描述】:
我是 OOP 的新手。我正在努力保持 SOLID 原则。有一些问题。这是我的代码。当我作为依赖项class Image()、class Video() 或 UploaderClient 中的其他内容传递时,有没有办法访问 class GenericUploader 中的 class FileManager 方法(使用抽象类,因为我可以提供一些基本功能)?目标始终是访问class FileManager 方法,不管我作为依赖图像、视频还是文件管理器传递?
interface IFile
{
public function crete(array $data);
}
interface IFileManager extends IFile
{
public function exist(int $id);
}
class FileManager implements IFileManager
{
public function crete(array $data)
{
// store in DB files
}
public function exist()
{
}
}
class Image implements IFile
{
public function crete(array $data)
{
//access to FileManager
// store in DB image and files
}
}
abstract class GenericUploader
{
public $service;
public function __construct(IFile $service)
{
$this->service = $service;
}
public function upload()
{
//access to FileManager if $service is new Image()
}
}
class ImageUploader extends GenericUploader
{
public function __construct(IFile $service)
{
parent::__construct($service);
}
}
class FileManagerUploader extends GenericUploader
{
public function __construct(IFile $service)
{
parent::__construct($service);
}
}
class UploaderClient
{
public function uploadFile(IFile $service)
{
$name = get_class($service);
$uploaderClass = $name . 'Uploader';
if (class_exists($uploaderClass)) {
$uploader = new $uploaderClass($service);
$uploader->upload();
}
}
}
$client = new UploaderClient();
$client->uploadFile(new Image());
$client->uploadFile(new FileManager());
更新:如果我扩展 Image,例如
class Image extends FileManager implements IFile
{
public function crete(array $data)
{
//access to FileManager
// store in DB image and files
}
}
从 GenericUploader 以这种方式 ($this->service->exist) 访问类 FileManage 方法是否错误?是否违反开闭原则?
【问题讨论】:
-
如果你总是使用
FileManager的方法,为什么不把它添加到IFile接口?
标签: php oop dependencies solid-principles