[英]php oop call method from another class
我是OOP的新手。 我正在努力保持SOLID原则。 有一些问题。 这是我的代码。 当我通过依赖class Image()
, class Video()
或UploaderClient中的其他内容传递时,是否可以访问class GenericUploader
class FileManager
方法class GenericUploader
(使用抽象类,因为我可以提供一些基本功能)? 目标始终是可以访问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
,它可以帮助您:
UPD :
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.