<?php
class Product{
public $name;
public $price; function __construct($name, $price){
$this->name = $name;
$this->price = $price;
}
} class ProcessSale{
private $callbacks; function registerCallback($callback){
if(!is_callable($callback)){
throw new Exception("callback not callable");
}
$this->callbacks[] = $callback;
} function sale($product){
print "{$product->name}:processing \n";
foreach ($this->callbacks as $callback){
call_user_func($callback, $product);
}
}
} $logger = create_function('$product', 'print " logging ({$product->name})\n";'); $processor = new ProcessSale();
$processor->registerCallback($logger); $processor->sale(new Product("shoes", 6));
print "\n";
$processor->sale(new Product("coffee", 6)); $logger2 = function($product){
print " logging ({$product->name})\n";
}; $processor = new ProcessSale(); $processor = new ProcessSale();
$processor->registerCallback($logger2); $processor->sale(new Product("shoes", 6));
print "\n";
$processor->sale(new Product("coffee", 6)); class Mailer{
function doMail($product){
print " mailing ({$product->name})\n";
}
} $processor = new ProcessSale();
$processor->registerCallback(array(new Mailer(), "doMail")); $processor->sale(new Product("shoes", 6));
print "\n";
$processor->sale(new Product("coffee", 6)); class Totalizer{
static function warnAmount(){
return function($product){
if ($product->price > 5){
print " reached high price: {$product->price}\n";
}
};
}
} $processor = new ProcessSale();
$processor->registerCallback(Totalizer::warnAmount()); //..... class TotalizerNew{
static function warnAmount($amt){
$count = 0;
return function($product) use ($amt, &$count){
$count += $product->price;
print " count: $count\n";
if ($count > $amt){
print " high price reached:{$count}\n";
}
};
}
} $processor = new ProcessSale();
$processor->registerCallback(TotalizerNew::warnAmount(8)); $processor->sale(new Product("shoes", 6));
print "\n";
$processor->sale(new Product("coffee", 6));

PHP 回调、匿名函数和闭包的更多相关文章

  1. 从匿名函数(闭包特性)到 PHP 设计模式之容器模式

    匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...

  2. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  3. 匿名函数、闭包、lambda表达式、Block

    C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure( ...

  4. php匿名函数和闭包的理解

    PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象. 匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参 ...

  5. Golang函数-匿名函数与闭包函数

    Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. JavaScript笔记 第十六章 匿名函数和闭包

    1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...

  7. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  8. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

  9. js匿名函数和闭包总结

    js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...

  10. Golang之匿名函数和闭包

    Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { ...

随机推荐

  1. find a multiple

    Description The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of ...

  2. cms修改栏目单页样式错位调整

    if (dt.Rows[0]["ClassTemplet"].ToString().Trim() == "") { rows_key.Style.Value = ...

  3. 杭电ACM 1197

    #include<stdio.h>main(){ int temp,i,t,sum10,sum12,sum16; for(i=1000;i<=9999;i++) { temp=i; ...

  4. document获取节点byTagName

    /* *对于页面中的超链接,新闻链接通过新窗口打开 *当然是要获取其中被操作的超链接对象. *可是通过Document获取超链接,拿到的是页面中所有的超链接节点. *只想获取一部分如何办呢? *只要获 ...

  5. 【iCore3 双核心板】例程十六:USB_HID实验——双向数据传输

    实验指导书及代码包下载: http://pan.baidu.com/s/1bojcVoV iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  6. php数字操作,高精度函数,保留计算结果小数位

    $l = 45456.51; $r = 455778.44; $e = '100.00'; $f= '500.00'; $res = bcadd($l, $r,3);//小数点后的位数,精度就是由这个 ...

  7. 浏览器中Javascript单线程分析

    线程这个特性对于一门语言环境来说是尤其重要的,在Java/C++环境下都提供了多线程API操作. 但在Javascript中据说代码执行时单线程的,大量计算的逻辑会阻塞浏览器HTML渲染,但setTi ...

  8. 关于Currency类型和 TCurrencyFiled的悲剧

    这2天程序出问题, 用户结算金额经常莫名其妙的多出了小数点后几位, 不用思考 肯定是因为浮点精度不准确的问题 查了一下, 程序中的数据类型使用的是Currency, 按照数据类型的描述, 这个金额类型 ...

  9. JVM监控和Java应用程序调试

    JConsole.VisualVM监控JVM(JMX) JAVA_OPTS后加:-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.managemen ...

  10. FlipView 索引为0 WP8.1

    如果使用FlipView时,出现别的页面切换到含有FlipView的页面时(缓存此页面/MainPage),点击或者滑动FlipView,Flipview自动索引到0 的问题解决办法 1.对Flipv ...