PHP:如何将对象属性或单个值从数组传递给匿名函数闭包

时间:2015-01-08 22:04:59

标签: php

我试图设置一个PHP Slim应用程序(与我的问题没有直接关系),我想要一个更好的方法将路由的依赖关系传递给我的路由功能。例如,以下内容可以正常工作:

$app = new \Slim\Slim();

$testMessage = 'This is a test';

$app->get('/hello', function () use ($testMessage) {
    echo $testMessage; //output: This is a test
});

但是我也试图使用Pimple(依赖注入)来创建一个我可以引用的数组。我并没有将整个数组传递给我的路径,而是仅传递我需要的对象/服务(使代码更易于维护)。例如:

$app = new \Slim\Slim();

$container = new Container();

$container['test'] = function ($c) {
    return new Test();
};

$app->get('/hello', function () use ($container['test']) { //I get a syntax error on this line
    var_dump($container['test']);
});

我可以"使用"整个$container,但随后我将容器中的所有内容传递给路径,即使我只需要一个对象。在尝试调试时,我发现我可以传递任何看起来像这样的变量:$simple,它可以包含整个数组或对象,但是我不能使用对象属性($Test->value )或数组中的单个值($array['value']),除非我添加了重新分配这些值的额外样板:

$Test = $container['test'];
$app->get('/hello', function () use ($Test) {
    var_dump($Test); //everything works fine
});

但是我在路线范围之外创造了额外的物品,当然这可能会变得混乱。

有人可以告诉我是否可以通过use $container['test']关闭,或提供任何建议?

1 个答案:

答案 0 :(得分:1)

我建议传递整个容器对象。它只会产生很少的额外开销(只是一个新的引用),而且你不会创建额外的无范围变量。如果需要,它还允许您添加依赖项。