【问题标题】:redundant getters and setters in lazy-loading and dependency-injection pattern延迟加载和依赖注入模式中的冗余 getter 和 setter
【发布时间】:2013-04-03 11:37:42
【问题描述】:

我目前正在我的 PHP 应用程序中实现延迟初始化和依赖注入模式,并面临以下问题:

每个类都有一堆 getter 和 setter 方法提供外部类的对象。有没有一种优雅的方法可以将这种“冗余”移除到父类或某种工厂?

编辑:不失可测试性的优势;-)

EDIT2:这是一个 getter 和 setter 方法的示例,就像我使用它们一样:

function getSql() {
    if (is_object($this->sql) === FALSE) {
        $registry = \Registry::getInstance();
        $factories = $registry->get('factories');
        $database = $factories['databaseSql'];
        $this->sql = $database->getSql();
    }

    return $this->sql;
}

function setSql($sqlObject) {
    // ... some checks
    $this->sql = $sqlObject;
}

EDIT3 我遵循了使用特征的想法,所以这里是一个使用“注册”类特征的示例解决方案:

trait Registration {

    private $registration = null;

    public function getRegistration() {
        $registry = \Registry::getInstance();
        $factories = $registry->get('factories');

        if (is_object($this->registration) === TRUE) {
            // get obect if instance already exists
            $registration = $this->registration;
        } else if (isset($factories['registration']) === TRUE) {
            // get object using the matching factory
            $registrationFactory = $factories['registration'];
            $registration = $registrationFactory->getRegistration();
        } else if (class_exists('\engine\classes\Registration') === TRUE) {
            // get object using the default object class when no specific factory is defined
            $registration = new \engine\classes\Registration();
        } else {
            throw new \Exception('error getting an instance of Registration');
        }

        $this->registration = $registration;

        return $registration;
    }

    public function setRegistration($object) {
        if (is_object($object) === FALSE)
            throw new \Exception('invalid registration object');

        $this->registration = $object;
    }
}

用法

class Foo {
    use Registration;

    public function bar() {
        $reg = $this->getRegistration();
        // ... use instance of Registration
    }
}

【问题讨论】:

    标签: php dependency-injection coding-style lazy-loading traits


    【解决方案1】:

    你知道PHP语言的OOP优势吗?

    Inheritance

    Traits

    Magic getter and setters

    可能是一些面向方面的编程。例如Implementing Reusable Fluent Interface Pattern in PHP With AOP

    因为你没有提供任何代码,所以链接太多了。

    【讨论】:

    • 我添加了一个示例,并将阅读您提到的链接。我知道继承、魔术 getter 和 setter。
    • 当另一个类需要这样的对象时,让这个 getter/setter 对使用的特性会更好吗?
    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多