我正在尝试在我的应用中使用“类型提示”功能,但某些功能无法正常工作。我尝试了以下
define('PULSE_START', microtime(true));
require('../Pulse/Bootstrap/Bootstrap.php');
$app = new Application();
$app->run();
$app->get('/404', function(Application $app)
{
$app->error(404);
});
而不是404输出我得到了这个
Catchable fatal error: Argument 1 passed to {closure}() must be an instance of Pulse\Core\Application, none given in E:\Server\xampp\htdocs\web\pulse\WWW\Index.php on line 23
我不明白,Application类是一个命名空间类(Pulse \ Core \ Application),但我创建了一个Alias,所以我不认为这就是问题。
答案 0 :(得分:1)
从none
作为传入的类型值给出的事实我认为get在使用闭包时没有传递参数。要将$ app添加到闭包中,您可以use
代替该应用程序。
$app->get('/404', function() use ($app)
{
$app->error(404);
});
并验证您的get
方法是否正在传递$this
作为匿名函数的第一个参数。
答案 1 :(得分:1)
Typehinting不起作用 - 它需要参数为给定类型,但您必须创建代码来调整传递给闭包的参数。这种智能参数的实现非常简单:
class Application{
private $args = array(); //possible arguments for closure
public function __construct(){
$this->args[] = $this; //Application
$this->args[] = new Request;
$this->args[] = new Session;
$this->args[] = new DataBase;
}
public function get($function){
$rf = new ReflectionFunction($function);
$invokeArgs = array();
foreach($rf->getParameters() as $param){
$class = $param->getClass()->getName();
foreach($this->args as $arg) {
if(get_class($arg) == $class) {
$invokeArgs[] = $arg;
break;
}
}
}
return $rf->invokeArgs($invokeArgs);
}
}
$app = new Application();
$app->get(function (Application $app){
var_dump($app);
});