2012-03-31 68 views
4
public function process(Zend_Controller_Request_Abstract $request) 
{ 
    $this->first_name = $this->sanitize($request->getPost('first_name')); 
.... 
} 

我的問題是$requestzend_controller_request_abstract類的實例,但的getPost是zend_controller_request_http延伸zend_controller_request_abstract類中定義的函數,那麼爲什麼$request直接調用getPost()

回答

7

類型提示是僅僅是一個暗示。它的全部內容是$request必須從Zend_Controller_Request_Abstract延伸。它確實是而不是的意思是$requestZend_Controller_Request_Abstract的一個實例。

在這種特殊情況下,$requestZend_Controller_Request_Http一個實例,它確實實現getPost(),所以你可以調用$request->getPost()沒有問題。 $request也是一個從Zend_Controller_Request_Abstract延伸出來的類的實例,因此PHP允許它首先傳遞給process方法。

+1

爲了擴展這個答案:''instanceof'在這種情況下非常有用,它使您能夠測試對象的實際類型 - 如果您不這麼做,那麼對於不支持getPost的對象()。 – Niko 2012-03-31 15:47:08

0

getPost()Zend_Controller_Request_AbstractZend_Controller_Request_Abstract定義不被任何其他類 的擴展繼承了這個功能,因此,在短期,您發佈的代碼應該拋出一些異常/錯誤。

編輯:它看起來在PHP中,「如果類或接口被指定爲類型提示,那麼它的所有子級或實現也被允許。這意味着你可以通過Zend_Controller_Request_HTTPprocess(),它會工作。

來源:http://php.net/manual/en/language.oop5.typehinting.php