PHP - $request->getPost('first_name')


PHP - $request->getPost('first_name')

public function process(Zend_Controller_Request_Abstract $request)
{
     $this->first_name = $this->sanitize($request->getPost('first_name'));
....
}

我的问题是$request是类zend_controller_request_abstract的实例,但getpost是在类zend_controller_request_http中定义的扩展zend_controller_request_abstract的函数,那么为什么$request直接调用getPost()呢?

类型提示就是这样,一个提示。它所声明的只是$request必须从Zend_Controller_Request_Abstract扩展。这并不意味着$requestZend_Controller_Request_Abstract的实例。

在这种特殊情况下,$requestZend_Controller_Request_Http的一个实例,它确实实现了getPost(),因此您可以毫无问题地调用$request->getPost()$request也是从Zend_Controller_Request_Abstract扩展的类的实例,因此PHP首先允许将其传递到process方法中。

getPost() 没有

Zend_Controller_Request_Abstract中定义,Zend_Controller_Request_Abstract也不会通过扩展任何其他类来继承此函数,因此简而言之,您发布的代码应该抛出一些异常/错误。

编辑:似乎在PHP中,"如果类或接口被指定为类型提示,那么它的所有子项或实现也被允许。这意味着您可以将Zend_Controller_Request_HTTP传递给process()并且它将起作用。

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