繁体   English   中英

另一个类的php oop调用方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM