我正在尝试使用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需要返回特定类型的对象呢?
答案 0 :(得分:0)
不,在语言层面上,不可能约束函数的返回值。只允许函数参数'类型提示 - http://www.php.net/manual/en/language.oop5.typehinting.php
您可以做的是确保提前捕获错误类型的返回值。比如,在IOC容器启动代码中。您实例化DbInterface
,并检查run()
的返回类型。如果不对,请抛出异常。
答案 1 :(得分:0)
把整件事情都考验一下。如果您的某个测试指定返回类型必须为x,则希望在使用新实现时测试失败。在测试失败之后,希望开发人员将测试用作开发人员文档并查看预期的行为。