PHP类型提示无法正常工作

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

仍然无法工作,同样的错误。 - user2521224
1
展示一下代码片段,其中包含实际调用匿名函数的 ->get。 - tlenss
这是来自闭包内部的var_dump吗? - Orangepill
Pulse是什么?是框架/路由器还是你自己的代码? - dev-null-dweller
@Orangepill 不,如果你移除类型提示并从闭包中调用var_dump,你将得到NULL。 - user2521224
显示剩余5条评论
2个回答

1

根据传递的类型值为none,我认为在使用闭包时,get方法没有传递参数。要将$app传递到闭包中,您可以使用应用程序而不是直接传参。

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

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


这个可以运行,但我仍然不明白为什么我的代码不能运行。但是由于我可以在使用中传递多个变量,所以这对我来说没问题。谢谢。 - user2521224
@SilvioMarijic请在Application::get中展示代码,这样我们就可以找到问题的根源。 - Orangepill
这是$app->get()方法的代码。基本上只是将参数传递给Route类,而Route类则调用Router。`public function get($route, $action) { return Route::get($route, $action); }` - user2521224
在Route :: get中,您应该有类似于... $ route($ this,$ action)...的东西,因为它是从应用程序实例静态调用的,那么$ this将解析为您的应用程序实例...但这会使您的Route :: get命令仅能从应用程序上下文中使用,这可能不是您想要的。 - Orangepill
我认为在闭包中使用 use 符号会更好。 - Orangepill

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接