4

我正在尝试在我的应用程序中使用类型提示功能,但有些东西无法正常工作。我尝试了以下

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),但我创建了一个别名,所以我认为这不是问题所在。

4

2 回答 2

1

类型提示不是这样工作的——它要求参数是给定的类型,但是你必须创建代码来调整传递给闭包的参数。这种智能参数的非常简单的实现:

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);
});
于 2013-07-22T17:57:14.480 回答
1

从作为传入类型值给出的事实来看,none我认为 get 在使用闭包时没有传递参数。要将 $app 放入闭包中,您可以use改为使用应用程序。

$app->get('/404', function() use ($app)
{
    $app->error(404);
});

并验证您的get方法是否$this作为匿名函数的第一个参数传递。

于 2013-07-22T17:28:26.080 回答