簡體   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