如何确保对象方法返回预期的对象?

时间:2011-05-16 16:35:04

标签: php type-hinting

我正在尝试使用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需要返回特定类型的对象呢?

2 个答案:

答案 0 :(得分:0)

不,在语言层面上,不可能约束函数的返回值。只允许函数参数'类型提示 - http://www.php.net/manual/en/language.oop5.typehinting.php

您可以做的是确保提前捕获错误类型的返回值。比如,在IOC容器启动代码中。您实例化DbInterface,并检查run()的返回类型。如果不对,请抛出异常。

答案 1 :(得分:0)

把整件事情都考验一下。如果您的某个测试指定返回类型必须为x,则希望在使用新实现时测试失败。在测试失败之后,希望开发人员将测试用作开发人员文档并查看预期的行为。