首页 > 解决方案 > 来自另一个类的php oop调用方法

问题描述

我是 OOP 的新手。我正在努力保持 SOLID 原则。有一些问题。这是我的代码。当我作为依赖项或 UploaderClient 中的其他内容传递时,有没有办法访问(使用抽象类,因为我可以提供一些基本功能)中的class FileManager方法?目标始终是访问方法,不管我作为依赖图像、视频还是文件管理器传递?class GenericUploaderclass 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 方法是否错误?是否违反开/关原则?

标签: phpoopdependenciessolid-principles

解决方案


如果我理解写你的问题 - 请试试我的代码。有一个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());

推荐阅读