php - 我可以重用装饰器吗?

标签 php mysql oop design-patterns decorator

我可以重用装饰器吗?

我有一个 ClientDecorator 来装饰一个引用了客户端的实体,这个装饰器在调用 getClient 时获取数据库中的客户端(在它被装饰之前,这个方法返回clientId,修饰后返回Client实例。

好的,但是,我有一些其他的实体可以用相同的装饰器装饰,例如,我有另一个名为 questions 的表,这个表有一个指向客户端的引用问了一个问题,我有另一个名为 schedules 的表,其中有一个客户的引用。

顺便说一句,我可以用ClientDecorator装饰questionschedule

但是,我也有一个 QuestionDecorator;这个人装饰了一个Answer,等等

我如何做这个抽象,以便我可以随时重用装饰器?

我已经尝试创建 ClientDecorableQuestionDecorable 接口(interface),但没有取得任何进展。

最佳答案

您始终可以实例化装饰器类,将参数传递给构造器,构造器将告诉它应该如何表现或应该模拟哪个类。您实际上不必将装饰器声明为另一个类的扩展。

PHP 类支持 magic methods这使得将调用转发到您的对象正在模拟的类成为可能,就好像它正在使用 extends 扩展它一样。

例如:

class Client
{
    public function getId() { return 123; }
}

class Decorator
{
    private $instance = null;

    public function __construct($class)
    {
        $this->instance = new $class();
    }

    public function __call($method, $params) // magic method
    {
        return call_user_func_array(array($this->instance, $method), $params);
    }
}

$object = Decorator('Client');
echo $object->getId(); // 123

当您尝试访问不属于类 Decorator 的方法时,将调用魔法方法 __call()。通过使用魔术方法 __get()__set() 可以对属性完成相同的操作。

关于php - 我可以重用装饰器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884049/

相关文章:

PHP json 编码和 JS JSON.stringify

PHP/Mysql Order by 和 Rand()

php - 如何与 PHP 建立 SSL 连接

php - 当我通过电子邮件地址选择时,为什么会出现 MySQL 语法错误 (1604)?

mysql - 在数据库列中存储结构化数据?

php - 为什么 $row 数组没有填充查询值

javascript - 在PHP中获取HTML标签 'select'的值

c++ - 不使用 if 语句调用多个类

java - 设计一个简单的文件管理器

ios - 类型转换 SIGABRT