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() { ...
随机推荐
- WordPress插件开发实例教程 - 版权插件
说明:本教程仅限学习,高手请绕道 开发程序:WordPress 3.9-RC1 使用主题:Twenty Fourteen 在开始之前,需要注意三件事情 I.给插件取一个个性化的名字,越个性化越好,以防 ...
- 杭电ACM 1197
#include<stdio.h>main(){ int temp,i,t,sum10,sum12,sum16; for(i=1000;i<=9999;i++) { temp=i; ...
- response的outputStream输出数据的问题
package cn.itcast.response; import java.io.IOException; import java.io.OutputStream; import java.io. ...
- SVN 分支管理
平时在工作中使用 SVN 只是限于 commit,update 这样的操作,至多再 reslove 解决一下冲突,没有用过分支管理.开发过程中一般都是一个功能开发完成之后整体进行提交,而最近在项目中有 ...
- web.xml配置error-page
一. 通过错误码来配置error-page <error-page> <error-code>404</error-code> <location>/e ...
- ExtJS笔记 Reader
Readers are used to interpret data to be loaded into a Model instance or a Store - often in response ...
- Java 学习第一步-JDK安装和Java环境变量配置
Java学习第一步——JDK安装及Java环境变量配置 [原文] 2014-05-30 9:09 Java SE 阿超 9046 views Java作为当下很主流的编程语言,学习Java的朋 ...
- 使用CSS将图片转换成黑白(灰色、置灰)z转
小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...
- [LeetCode]题解(python):125 Valid Palindrome
题目来源 https://leetcode.com/problems/valid-palindrome/ Given a string, determine if it is a palindrome ...
- windows 文件权限导致的 git 问题
windows 文件权限导致的 git 问题 在 windows 上使用 git 时,会遇到明明什么都没有改动,但是 git status 显示一堆文件被修改.这时,通过 git diff 可看到什么 ...