最新消息:欢迎加入小松的QQ群一起讨论一起学习,多说即将关闭,感觉好可惜啊

laravel匿名函数

PHP 123浏览 0评论

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。具体介绍请查官方手册
http://php.net/manual/zh/class.closure.php

匿名函数示例

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld
?>

匿名函数可以赋值个一个变量

PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号

<?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');

匿名函数从父作用域继承变量。 任何此类变量都应该用 use 语言结构传递进去

<?php
$message = 'hello';

// 没有 "use"
$example = function () {
    var_dump($message);
    echo "<br/>";
};
echo $example();//输出 null

// 继承 $message
$example = function () use ($message) {
    var_dump($message);
    echo "<br/>";
};
echo $example();//hello

// Inherited variable's value is from when the function
// is defined, not when called
$message = 'world';
echo $example();//输出 hello

// Reset message
$message = 'hello';

// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
    echo "<br/>";
};
echo $example();//输出 hello

// The changed value in the parent scope
// is reflected inside the function call
$message = 'world';
echo $example();//输出 world

// Closures can also accept regular arguments
$example = function ($arg) use ($message) {
    var_dump($arg . ' ' . $message);
    echo "<br/>";
};
$example("hello");//输出 hello world
?>

在laravel框架中使用了大量的匿名函数,举例一个文件

文件:laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php
这是一个容器文件

<?php
    //省略代码
    public function bind($abstract, $concrete = null, $shared = false)
    {
        //省略代码
        //判断是否有这个闭包函数(匿名函数),存在返回false,存在返回true
        if (! $concrete instanceof Closure) {
            //参数不是闭包函数,默认生成一个闭包函数
            $concrete = $this->getClosure($abstract, $concrete);
        }
        //省略代码

    }
    protected function getClosure($abstract, $concrete)
    {
        return function ($c, $parameters = []) use ($abstract, $concrete) {
            $method = ($abstract == $concrete) ? 'build' : 'make';

            return $c->$method($concrete, $parameters);
        };
    }
    //省略代码
QQ交流群:136351212

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» laravel匿名函数
本文链接地址:https://www.phpsong.com/2802.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!