【问题标题】:How to make sure object method returns expected object?如何确保对象方法返回预期对象?
【发布时间】:2011-08-26 14:27:10
【问题描述】:

我正在尝试使用 DI 将一个对象放入另一个对象中。这很容易使用界面和类型提示。

问题是我正在注入的对象返回另一个具有预期方法之一的对象,并且该对象无法进行类型提示。问题看起来像这样。

class Db implements DbInterface {
    public function query($query) {
        return new Result($query);
    }
}

interface DbInterface {
    public function query($query);
}

class Result {
    public function getRow() {
        // get row here
    }
}

class SomeClass {
    protected $data;

    // injection is here
    public function __construct(DbInterface $db) {
        $result = $db->query($some_query);
        $this->data = $result->getRow();
    }
}

我可以确保我得到了正确的 DbInterface 对象,但是有没有办法确保该对象的 run() 方法返回正确的对象类型?我已经看过了,但找不到输入提示函数返回结果的方法。

这可能会导致稍后在更复杂的代码中出现问题。如果有人编写了 DbInterface 的新实现,如果没有办法强制执行,他们怎么知道 run 需要返回特定类型的对象?

【问题讨论】:

    标签: php type-hinting


    【解决方案1】:

    对整个事情进行测试。如果您的一项测试指定返回类型必须为 x,那么希望在使用新实现时测试会失败。除了测试失败之外,希望开发人员将测试用作开发人员文档并查看预期的行为。

    【讨论】:

      【解决方案2】:

      不,在语言级别上,不可能限制函数的返回值。只允许函数参数的类型提示 — http://www.php.net/manual/en/language.oop5.typehinting.php

      您可以做的是确保尽早发现错误类型的返回值。比如说,在 IOC 容器启动代码中。您实例化您的DbInterface,并检查run() 的返回类型。如果错了,抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        相关资源
        最近更新 更多