2011-05-16 114 views
2

我想用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的新实现,他们如何知道如果无法执行它,那么运行需要返回特定类型的对象?

回答

0

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

0

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

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