php 匿名函数

来源:互联网 发布:linux怎么建站 编辑:程序博客网 时间:2024/05/22 08:16

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

匿名函数是在php5.3之后才引入的概念,到现在php7.0为止通过 Closure 类来实现。

一、匿名函数

下面我们看下匿名函数定义方式(和JS相似)

$anonymousFunction = function(){    ...};

例如:我们通过匿名函数来输出 ‘This is anonymous function’

$anonymousFunction = function($a){    echo $a;};$anonymousFunction('This is anonymous function');

在工作中往往我们也会用到,如 preg_replace_callback

preg_replace_callback('/[a-z\W]+/', function ($match) {    print_r($match);}, 'hello world 123');

二、闭包

如果我们将匿名函数放到普通方法中,这样就形成了一个简单的闭包

function func () {    $anonymousFunction = function(){        echo 'This is anonymous function';    };    $anonymousFunction();}func();

倘若我们需要在匿名函数中调用普通方法的局部变量 如

function func () {    $data = 'This is anonymous function';    $anonymousFunction = function(){        echo $data;    };    $anonymousFunction();}func();

结果是返回一个notice错误
Notice: Undefined variable: data in /private/var/www/test/index.php on line 28

那我们需要在匿名函数中调用局部变量,应该怎么做呢?

二.1 作为参数传递

function func () {    $data = 'This is anonymous function';    $anonymousFunction = function($data){        echo $data;    };    $anonymousFunction($data);}func();

二.2 使用关键字 use
<注:use关键字除了在命名空间中 引入文件并为文件起别名以外的第二个用途>

function func () {    $data = 'This is anonymous function';    $anonymousFunction = function() use ($data){        echo $data;    };    $anonymousFunction();}func();

倘若我们需要用闭包改变引入变量值,那我们就需要用到&(取地址符了) 如

function func () {    $data = 'This is anonymous function';    $anonymousFunction = function(&$data) {        $data = 'Change';    };    $anonymousFunction($data);    echo $data;}func();
或者
function func () {    $data = 'This is anonymous function';    $anonymousFunction = function() use (&$data){        $data = 'Change';    };    $anonymousFunction();    echo $data;}func();
另外,我们还可以将匿名函数作为参数进行传递

$anonymousFunction = function($mess){    return $mess;};function ff ($para, $mess) {    echo $para($mess);}ff($anonymousFunction, 'This is anonymous function');

以上为个人理解,倘若有不对的地方感谢告知。

原创粉丝点击