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

Example #1 匿名函数示例

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

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

Example #2 匿名函数变量赋值示例


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

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

闭包可以从父作用域中继承变量。
任何此类变量都应该用 use 语言结构传递进去。

Example #3 从父作用域继承变量


<?php
$message = 'hello';

// 没有 "use"
$example = function () {
    var_dump($message);
};
echo $example();

// 继承 $message
$example = function () use ($message) {
    var_dump($message);
};
echo $example();

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

// Reset message
$message = 'hello';

// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
};
echo $example();

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

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

以上例程的输出类似于:

Notice: Undefined variable: message in /example.php on line 6
NULL
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "world"
string(11) "hello world"

这些变量都必须在函数或类的头部声明。 从父作用域中继承变量与使用全局变量是不同的。全局变量存在于一个全局的范围,无论当前在执行的是哪个函数。而 闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。示例如下:

Example #4 Closures 和作用域

<?php
// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。
// 其中有一个方法用来计算购物车中所有商品的总价格,该方法使
// 用了一个 closure 作为回调函数。
class Cart
{
    const PRICE_BUTTER  = 1.00;
    const PRICE_MILK    = 3.00;
    const PRICE_EGGS    = 6.95;

protected   $products = array();
    
    public function add($product, $quantity)
    {
        $this->products[$product] = $quantity;
    }
    
    public function getQuantity($product)
    {
        return isset($this->products[$product]) ? $this->products[$product] :
               FALSE;
    }
    
    public function getTotal($tax)
    {
        $total = 0.00;
        
        $callback =
            function ($quantity, $product) use ($tax, &$total)
            {
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };
        
        array_walk($this->products, $callback);
        return round($total, 2);;
    }
}

$my_cart = new Cart;

// 往购物车里添加条目
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);

// 打出出总价格,其中有 5% 的销售税.
print $my_cart->getTotal(0.05) . "\n";
// 最后结果是 54.29
?>

匿名函数目前是通过
Closure 类来实现的。

更新日志

版本 说明
5.4.0 $this 可用于匿名函数。
5.3.0 可以使用匿名函数。

最新文章

  1. Android 四大组件之再论BroadCast
  2. Pandas-多表操作
  3. Linux安装搜狗拼音输入法
  4. Eclipse 启动出现错误 no java virtual machine was found
  5. java父类与接口有相同的方法
  6. Xml生成节点声明
  7. php注意事项
  8. Boostrap响应式与非响应式
  9. tomcat7登录账户配置
  10. Redis windows安装配置与Jedis访问数据库
  11. hdu 4068 SanguoSHA
  12. python 全栈开发之路 day1
  13. SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
  14. 隐藏Nginx版本号的安全性与方法
  15. 06_Ajax初步入门第一天
  16. python语言基础语法笔记&lt;note2--面向对象编程&gt;
  17. 07-TypeScript的For循环
  18. FFmpeg API 变更记录
  19. CentOS 7 安装docker (图文)
  20. Centos7 安装 Redis

热门文章

  1. mac pro上安装docker
  2. beego学习笔记(4):开发文档阅读(5)
  3. appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案
  4. (转载)使用curl 和 libjson 完成联网和数据解析
  5. bzoj 1224
  6. 20179202《Linux内核原理与分析》第一周作业
  7. 【记录】mysql 无法启动 : NET HELPMSG 3523
  8. java.io 文件分类
  9. CF438 The Child and Sequence
  10. python-爬虫技能升级记录