【问题标题】:php oop call method from another class来自另一个类的php oop调用方法
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 好的,但在这种情况下,FileManagerUploader 会怎样。如果我使用 trait 并将 FileManager 作为依赖项传递($client->uploadFile(new FileManager)。我也想独立使用 FileManager。
  • GenericUploader 类是 Image、Video、FileManager 的通用类,在这种情况下 $client->uploadFile(new FileManager()) IFile $service 和扩展 FileManager 类是同一个对象。
  • 相同的类,但不同的对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2015-07-19
  • 2012-05-29
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多