匿名函数使用use调用父作用域中的变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youcijibi/article/details/87909631
<?php
class  Product
{
    public $_name;
    public $_price;

    public function __construct($name, $price)
    {
        $this->_name = $name;
        $this->_price = $price;
    }
}

class ProcessSale
{
    private $_callback;

    public function registerCallback($callback)
    {
        if (!is_callable($callback)) {
            throw new Exception('callback not callable');
        }
        $this->_callback[] = $callback;
    }

    public function sale($product)
    {
        print "{$product->_name}\r\n";
        foreach ($this->_callback as $callback) {
            call_user_func($callback, $product);
        }
    }
}

class Totalizer
{
    static function warnAmount($amt)
    {
        $count = 0;
        return function ($product) use ($amt, &$count){  //匿名函数可以引用在其父作用域中声明的变量,比如说,匿名函数能记得它被创建时所在的作用域,在这里当给$count变量加入引用符号时则表示它使用的是匿名函数中的引用而不是值,在这里匿名函数能记住本身的作用域,而$count又是使用的引用,所以其值是下方两次调用之后的总值,说明了回调跟踪了两次调用之间的$count
            $count += $product->_price;
            print "  count: $count\r\n";
            if ($count > $amt) {
                print " High price reached: {$count}";
            }
        };  //内联语句,所以需要分号结尾
    }
}

$processor = new ProcessSale();
$processor->registerCallback(Totalizer::warnAmount(8));

$processor->sale(new Product('shoes', '6'));
print "\r\n";
$processor->sale(new Product('coffee', '6'));

个人理解:敲黑板->匿名函数能记得它被创建时所在的作用域。

匿名函数可以引用在其父作用域中声明的变量,比如说,匿名函数能记得它被创建时所在的作用域,在这里当给$count变量加入引用符号时则表示它使用的是匿名函数中的引用而不是值,在这里匿名函数能记住本身的作用域,而$count又是使用的引用,所以其值是下方两次调用之后的总值,说明了回调跟踪了两次调用之间的$count 

猜你喜欢

转载自blog.csdn.net/youcijibi/article/details/87909631
今日推荐