2

我正在用 php 实现 Klein 路由器,我有一个小问题......我想从我的控制器调用一个特殊函数,给它(或不给它) $request 变量,如下所示:

$klein->respond('GET', '/[i:id]?', HomeController::view($request));

但我有错误:Uncaught InvalidArgumentException: Expected a callable。得到一个不可调用的 NULL 所以我将代码更改为:

$klein->respond('GET', '/[i:id]?', new HomeController::view($request));

现在的错误是这样的:语法错误,意外的“视图”(T_STRING),期望变量(T_VARIABLE)或“$” 最后我找到了一个解决方案,写我的代码是这样的:

$klein->respond('GET', '/[i:id]?', function($request){ HomeController::view($request); });

这个正在工作,但我觉得我错过了一些东西......我想分解这个,有什么解决方案吗?谢谢

4

1 回答 1

2

尝试这个:

$klein->respond('GET', '/[i:id]?', array('HomeController','view'));

在 Klein 示例中,就像在您的第三个示例中一样,我们正在传递一个闭包、一个匿名函数、一个 lambda,或者您想要调用它的任何其他内容。无论如何,因为我们将其声明为内联,所以我们必须指定参数。

另一方面,HomeController::view在它自己的声明中指定了它的参数。如果您将参数内联,就像在您的第一个和第二个示例中一样,您实际上是view在该行上调用您的函数。您想将函数传递给$klein, 以便稍后调用,这就是我上面的示例应该做的。

Klein 的respond函数采用 PHP 所指的可调用对象。事实证明有一百万种方法可以在 PHP 中指定可调用对象:

http://php.net/manual/en/language.types.callable.php

我以为你可以这样做$klein->respond('GET', '/[i:id]?', HomeController::view);,但这似乎不正确。它适用于 Python,但不适用于 PHP。那好吧。

如果您使用的是 PHP 5.4 或更高版本,则可以使用短数组语法:

$klein->respond('GET', '/[i:id]?', ['HomeController','view']);

使它更紧凑一点。

于 2017-12-22T14:56:55.047 回答