Laravel DB::transaction 的传参陷阱 - PHP 匿名函数

文章目录

    今天在使用 Laravel 的事务的时候,一直报变量未定义的错误

    $order_id = 12;
    
    DB::transaction(function () {
    	$tmp = $order_id;
    });
    

    Undefined variable: order_id

    仔细一看,才发现这是个匿名函数

    匿名函数

    所以正确的使用方式是

    $order_id = 12;
    
    DB::transaction(function () use ($order_id) {
    	$tmp = $order_id;
    });
    

    参数写在哪里,第一个括号还是第二个括号

    这是第二次见到 PHP 的匿名函数,所以比较新鲜。。。

    看官方的示例

    // Closures can also accept regular arguments
    $example = function ($arg) use ($message) {
        var_dump($arg . ' ' . $message);
    };
    $example("hello");
    
    string(11) "hello world"
    

    可见,

    • 第一个括号里的参数是留给调用者的
    • 第二个括号,即 use 后的括号是用来继承上下文的

    参考

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式