PHP 回调、匿名函数和闭包
<?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 回调、匿名函数和闭包的更多相关文章
- 从匿名函数(闭包特性)到 PHP 设计模式之容器模式
匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...
- php的匿名函数和闭包函数
php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...
- 匿名函数、闭包、lambda表达式、Block
C#有lambda.匿名函数,js有匿名函数.闭包,OC中有block,看到这是不是心中有一万个草泥马在跑,不过它们这些都是换汤不换药,不同语言名字不一样. 从功能性上说lambda和closure( ...
- php匿名函数和闭包的理解
PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象. 匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参 ...
- Golang函数-匿名函数与闭包函数
Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- JavaScript笔记 第十六章 匿名函数和闭包
1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function getName() { return 'name'; } a ...
- 第一百一十节,JavaScript匿名函数和闭包
JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...
- JavaScript(第十五天)【匿名函数和闭包】
学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- Golang之匿名函数和闭包
Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { ...
随机推荐
- Mysql的时间和日期
datetime 占8个字节 可以显示日期同时显示时间 yyyy-mm-dd hh:mm:ss 显示范围 1000-01-01 00:00:00----9999-12-31 23:59 ...
- Matlab图像处理函数:regionprops
本篇文章为转载,仅为方便学术讨论所用,不用于商业用途.由于时间较久,原作者以及原始链接暂时无法找到,如有侵权以及其他任何事宜欢迎跟我联系,如有侵扰,在此提前表示歉意.----------------- ...
- IOS第11天(3:UIPickerView省市联动)
********* #import "ViewController.h" #import "Province.h" @interface ViewControl ...
- EmguCV 阈值化
一.public static double cvThreshold( IntPtr src, IntPtr dst, double threshold, double maxValue, //Max ...
- DOM模型有三种
<!-- DOM模型有三种: DOM level 1:将HTML文档封装成对象. DOM level 2:在level 1基础加入新功能,比如解析名称空间. //<html xmlns=& ...
- php吧字符串直接转换成数组处理
$str ='123456'; echo strlen($str) - 1; echo '<br>'; echo $str{strlen($str) - 1}; echo '<br& ...
- asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(一)
基本环境:asp.net 4.5.2 仔细看了在Webform下,模板就已经启动了角色控制,已经不用再进行设置了.直接调用相关类就可以了.这和原来在网站根目录下配置Web.config完全不同了. 相 ...
- Android内存泄露
Android 内存泄漏是一个十分头疼的事情.LeakCanary是一款开源软件,主要作用是检测 Android APP 内存泄露.比起以前的 MAT 工具,LeakCanary 有着十分强大的功能, ...
- iOS ARC中CTCallCenter没用,无法监听电话的解决方案
今天在尝试使用CTCallCenter进行电话监听时,发现一直无法捕获电话状态改变的事件,研究了一番之后找到了解决方案,在这里分享给大家. 首先使用CTCallCenter监听电话的代码如下: CTC ...
- RDIFramework.NET ━ 9.3 用户管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.3 用户管理 -Web部分 用户管理模块主要是对可登录系统的用户进行管理.后续的工作如:用户归属角色.权限的分配.用户所拥有 ...