1. <?php
  2. class Product{
  3. public $name;
  4. public $price;
  5.  
  6. function __construct($name, $price){
  7. $this->name = $name;
  8. $this->price = $price;
  9. }
  10. }
  11.  
  12. class ProcessSale{
  13. private $callbacks;
  14.  
  15. function registerCallback($callback){
  16. if(!is_callable($callback)){
  17. throw new Exception("callback not callable");
  18. }
  19. $this->callbacks[] = $callback;
  20. }
  21.  
  22. function sale($product){
  23. print "{$product->name}:processing \n";
  24. foreach ($this->callbacks as $callback){
  25. call_user_func($callback, $product);
  26. }
  27. }
  28. }
  29.  
  30. $logger = create_function('$product', 'print " logging ({$product->name})\n";');
  31.  
  32. $processor = new ProcessSale();
  33. $processor->registerCallback($logger);
  34.  
  35. $processor->sale(new Product("shoes", 6));
  36. print "\n";
  37. $processor->sale(new Product("coffee", 6));
  38.  
  39. $logger2 = function($product){
  40. print " logging ({$product->name})\n";
  41. };
  42.  
  43. $processor = new ProcessSale();
  44.  
  45. $processor = new ProcessSale();
  46. $processor->registerCallback($logger2);
  47.  
  48. $processor->sale(new Product("shoes", 6));
  49. print "\n";
  50. $processor->sale(new Product("coffee", 6));
  51.  
  52. class Mailer{
  53. function doMail($product){
  54. print " mailing ({$product->name})\n";
  55. }
  56. }
  57.  
  58. $processor = new ProcessSale();
  59. $processor->registerCallback(array(new Mailer(), "doMail"));
  60.  
  61. $processor->sale(new Product("shoes", 6));
  62. print "\n";
  63. $processor->sale(new Product("coffee", 6));
  64.  
  65. class Totalizer{
  66. static function warnAmount(){
  67. return function($product){
  68. if ($product->price > 5){
  69. print " reached high price: {$product->price}\n";
  70. }
  71. };
  72. }
  73. }
  74.  
  75. $processor = new ProcessSale();
  76. $processor->registerCallback(Totalizer::warnAmount());
  77.  
  78. //.....
  79.  
  80. class TotalizerNew{
  81. static function warnAmount($amt){
  82. $count = 0;
  83. return function($product) use ($amt, &$count){
  84. $count += $product->price;
  85. print " count: $count\n";
  86. if ($count > $amt){
  87. print " high price reached:{$count}\n";
  88. }
  89. };
  90. }
  91. }
  92.  
  93. $processor = new ProcessSale();
  94. $processor->registerCallback(TotalizerNew::warnAmount(8));
  95.  
  96. $processor->sale(new Product("shoes", 6));
  97. print "\n";
  98. $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. 管闲事的小明-nyoj51

    描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵 ...

  2. 关于svn的使用

    svn听课笔记 1. 下载并安装svn2. 将svn安装目录中bin目录添加到用户path变量中.3. 创建svn根目录svnroot4. 启动svn服务 在dos启动命令: svnserve -d ...

  3. BizTalk动手实验(四)Schema开发测试

    1 课程简介 通过本课程熟悉Schema的相关开发技术 2 准备工作 1. 熟悉XML.XML Schema.XSLT等相关XML开发技术 2. 新建BizTalk空项目 3 演示 3.1 格式化XM ...

  4. win10如何让她闭嘴、按什麽建系统都要说话、如何让她闭嘴?

    win10如何让她闭嘴.按什麽建系统都要说话.如何让她闭嘴? 开始 设置 轻松使用 讲述人,关掉……

  5. PowerDesigner 15.2入门学习 二

    PowerDesigner中如何生成主键和自增列 1.SQL Server版本: 第一步,首先要建立与数据库的连接,方法较多,这里举个例子: http://www.cnblogs.com/netsql ...

  6. Python的全局变量

    应该尽量避免使用全局变量.不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性.对全局变量,如果程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能导致程序中的错误.这种错误是很难 ...

  7. IOS第18天(6,CAKeyframeAnimation关键帧动画)

    ******* #import "HMViewController.h" @interface HMViewController () @property (weak, nonat ...

  8. Flink - RocksDBStateBackend

    如果要考虑易用性和效率,使用rocksDB来替代普通内存的kv是有必要的 有了rocksdb,可以range查询,可以支持columnfamily,可以各种压缩 但是rocksdb本身是一个库,是跑在 ...

  9. [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层架构,不!重!装!)

    目标: 我要做的事情是:修改文件系统,硬盘分区方案,但是不重装系统,整个操作不被应用层感知. 背景: 我的笔记本 ThinkPad T450.8G内存 + 16GB SSD + 1TB HDD.预装w ...

  10. 小吐槽Toolbar

    最近弄界面 要吧全部图标改成PNG格式 虽说从2010以后Delphi默认支持PNG格式图片, 但是想应用到按钮上, 似乎除了TButton意外, 也只能ToolBar可以正常显示了, 其他的, 比如 ...