PHP类型提示不起作用

时间:2013-07-22 17:07:45

标签: php closures instance type-hinting

我正在尝试在我的应用中使用“类型提示”功能,但某些功能无法正常工作。我尝试了以下

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,所以我不认为这就是问题。

2 个答案:

答案 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);
});