php - 来自另一个类的php oop调用方法
问题描述
我是 OOP 的新手。我正在努力保持 SOLID 原则。有一些问题。这是我的代码。当我作为依赖项或 UploaderClient 中的其他内容传递时,有没有办法访问(使用抽象类,因为我可以提供一些基本功能)中的class FileManager
方法?目标始终是访问方法,不管我作为依赖图像、视频还是文件管理器传递?class GenericUploader
class Image()
class Video()
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());
更新:如果我扩展图像,例如
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 方法是否错误?是否违反开/关原则?
解决方案
如果我理解写你的问题 - 请试试我的代码。有一个trait
,它可以帮助您:
更新:
interface IFile
{
public function crete(array $data);
}
// You can only implement interface, but not extends
class Image implements IFile
{
public function crete(array $data)
{
//access to FileManager
// store in DB image and files
}
}
class FileManager implements IFile
{
public function crete(array $data)
{
// store in DB files
}
public function exist(int $id)
{
}
}
abstract class GenericUploader extends FileManager
{
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());
推荐阅读
- sql - 从 Excel VBA 连接到 Azure 的连接丢失
- swift - 为什么 WKWebView 无法从 Firebase 打开 .doc?
- multiple-columns - 在 Tableau 中自动隐藏列
- javascript - 仅当圆圈具有关联的注释时才在折线图中附加圆圈
- vue.js - WebRTC 对等连接错误
- android - Android:我的服务未显示在开发人员选项->“正在运行的服务”中
- x11 - 来自窗口管理器的屏幕截图
- python - Pytorch拼写检查字符RNN不输出结束标记
- java - 如何在 Java 中加载没有 Spark 或 PMML 的决策树模型
- reactjs - 在 Material-UI CardMedia 中显示加载器