<?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