Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将变量传递给闭包_Php_Laravel_Php 7 - Fatal编程技术网

Php 将变量传递给闭包

Php 将变量传递给闭包,php,laravel,php-7,Php,Laravel,Php 7,假设我有一个结尾: $object->group(function() { $object->add('example'); $object->add('example'); }); 它将不起作用,因为$object未在闭包中定义 注意:未定义变量:manager 所以我必须使用($object): 现在我想让它和第一个一样简单,这样就必须在闭包中注入$object Laravel框架通过路由实现这一点,例如: Route::group(['middlewar

假设我有一个结尾:

$object->group(function() {
    $object->add('example');
    $object->add('example');
});
它将不起作用,因为$object未在闭包中定义

注意:未定义变量:manager

所以我必须
使用($object)

现在我想让它和第一个一样简单,这样就必须在闭包中注入$object

Laravel框架通过路由实现这一点,例如:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});
我相信拉威尔是通过反思课程来做到这一点的


我怎样才能做到这一点呢?

你不必担心反射。臭名昭著的Laravel依赖项注入容器将为您处理它。 你所需要做的就是告诉他当类型提示为
接口
时要注入什么

// xXxServiceProvider.php
function register(){
   ...
   this->app->bind('ObjNamespace\ObjClass', function ($app) {
       return new ObjNamepsace\ObjClass();
   });
}
现在,假设您希望在路由句柄中有一个
ObjNamepsace\ObjClass

Route::get('user/profile', function (ObjNamepsace\ObjClass $object) {
    // $object is resolved via type hinting
});
此外,有三种绑定方法,您可以选择哪一种适合您的用例:

  • bind
    :每次调用时注入一个新实例,Laravel每次都会创建一个新的$object

  • singleton
    :注入相同的实例,Laravel将在第一次调用时创建实例,并在每次需要的调用时注入实例。如果要创建一次
    $object
    ,请使用它

  • 实例
    :将
    接口
    绑定到对象实例


您的目标是了解如何为闭包提供参数。这是通过以下方式实现的

让我们在接受闭包的类中定义一个方法

class MyTestClass
{
    public function doWork(callable $callback)
    {
        return call_user_func_array($callback, [$this]);
    }
}

$obj = new MyTestClass();

$obj->doWork(function(MyTestClass $obj) {
    // 
});

注意:没有测试,但我认为这就是您想要的?

我认为
function()使用($object)
绝对没有问题。另一种方法没有更干净的。绝对是废话。我只是想知道Laravel是如何做到这一点的。Laravel使用
static
。你在使用对象。@MarcoAurélioDeleu不,这是一个门面。基本上是一个非静态方法的静态代理。就是这样做的。为闭包定义一个参数,然后使用
call\u user\u func\u array
调用闭包,其中指定要调用的函数以及要传递给它的参数。laravel routes就是我想要实现的一个示例。这个项目不是在LaravelWhy是Laravels服务容器“臭名昭著”据我所知,依赖注入的使用在不同的框架之间并没有太大的差异。同样的原则适用于所有地方。服务容器正是使Laravel成为如此受欢迎的框架的原因。如果你问我和facadesI,我想我不知道Laravel DI的一切。但我知道它允许一些神奇的代码在所有框架中都不可用。例如,它可以注入类,尽管它们没有注册。也许它有更多的技巧。我同意你的观点,我让拉威尔很受欢迎。但相信我,并不是所有人都喜欢它们。在这种情况下,你仍然需要设置参数,对吗?我想像拉威尔那样做。因此,依赖关系被注入到闭包中。也许是因为内容被克隆并附加到其中?我不知道。我发现了一种非常丑陋的方法,所以我决定坚持使用参数。您可以做的是获取方法的内容,如下所示:。然后使用
create\u function
创建一个接受参数的函数,然后注入依赖项。在闭包中可以有不同数量的参数。您可以有可为空的参数。如果您想针对可变数量的参数键入提示,那么您可能需要使用
反射
,这会变得很难看(以检查它期望作为参数的内容)。我认为你真的不需要做得太过分:)
class MyTestClass
{
    public function doWork(callable $callback)
    {
        return call_user_func_array($callback, [$this]);
    }
}

$obj = new MyTestClass();

$obj->doWork(function(MyTestClass $obj) {
    // 
});