2011-05-16 117 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()。如果不對,請拋出異常。