从匿名函数(闭包特性)到 PHP 设计模式之容器模式
匿名函数(匿名函数)
/* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */
$anonFunc = function($param){
echo $param;
};
$anonFunc('这里是一个匿名函数'); // 通过变量名调用匿名函数,和普通函数没什么区别
/* 示例二:通过在函数内部使用匿名函数动态创建函数 */
function operate($operator){
if($operator == '+'){
return function($a, $b){
return $a + $b;
}
}
if($operator == '-'){
return function($a, $b){
return $a - $b;
}
}
}
$add = operate('+');
echo $add(4, 3); //
$sub = operate('-');
echo $sub(4, 3); //
/* 示例三:匿名函数作为回调函数参数传入 */
function callback($callback){
$callback();
}
function callback(){
// 闭包测试函数
echo '这里是闭包测试函数体';
}
/* 示例三修改:匿名函数作为参数传入,并且携带参数 */
function callback($callback) use ($content){
$callback($content);
}
$content = '这里是闭包函数的输出内容';
function callback($content){
// 闭包函数
echo $content;
}
PHP 面向对象之容器模式
/* 声明一个简单的容器类 */
class Container{
private $_diList = array(); // 用于存放依赖
/* 核心方法之一,用于绑定服务
* @param string $className 类名称
* @param mixed $concrete 依赖在容器中的存储方式,可以是类名字符串,数组,一个实例化对象,或者是一个匿名函数
*/
puclic function set($className, $concrete){
$this->_diList[$className] = $concrete;
}
/*
* 核心方法之二,用于获取服务对象
* @param string $className 将要获取的依赖的名称
* @return object 返回一个依赖的实例化对象
*/
public function get($className){
if(isset($this->_diList[$className])){
return $this->diList[$className];
}
return null;
}
}
/* 数据库连接类 */
class Connection{
public function __construct($dbParams){
// connect the database...
}
public someDbTask(){
// code...
}
}
/* 会话控制类 */
class Session{
public function openSession(){
session_start();
}
// code...
}
$container->set('session', function(){
return new Session();
});
$container = new Container();
// 使用容器注册数据库连接服务
$container->set('db', function(){
return new Connetion(array(
"host" => "localhost",
"username" => "root",
"password" => "root",
"dbname" => "dbname"
));
});
// 使用容器注册会话控制服务
$container->set('session', function(){
return new Session();
});
// 获取之前注册到容器中的服务,并进行业务的处理
$container->get('db')->someDbTask();
$container->get('session')->openSession();
以上代码是对容器的使用方法,其中注册了 db 和 session 两个服务,这里使用匿名函数作为依赖的存储方式,在调用 $container->set() 方法进行注册服务时实际上并没有进行实例化,而是在调用 $container->get() 方法获取依赖的时候才执行匿名函数,并将实例化对象返回,这样实现了按需实例化,不用则不实例化,提高了程序的运行效率。
从匿名函数(闭包特性)到 PHP 设计模式之容器模式的更多相关文章
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- Go语言 - 函数 | 作用域 | 匿名函数 | 闭包 | 内置函数
函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 介绍 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于“一等公民”. 函数可以赋值给变量 函数 ...
- php : 匿名函数(闭包) [二]
摘自: http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html php的闭包(Closure)也就是匿名函数.是PHP5.3引入的. ...
- php : 匿名函数(闭包) [一]
摘自: http://www.cnblogs.com/starlion/p/3894578.html 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous fu ...
- javascript匿名函数 闭包
匿名函数 (function(){ console.info("111111111"); })(); var my = (fun ...
- PHP匿名函数(闭包)
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...
- php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法
1.认识 __set (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...
- PHP函数(六)-匿名函数(闭包函数)
匿名函数能够临时创建一个没有名称的函数,常用作回调函数参数的值 <?php $test = function($a){ echo "Hello,".$a; }; $test( ...
- JavaScript学习记录总结(六)——js函数闭包特性
<script type="text/javascript"> function arrdemo(){ var arr=["hello&q ...
随机推荐
- k8s master 节点加入到可以调配node节点中的命令
kubectl taint nodes --all node-role.kubernetes.io/master- 应该就可以了 效果再观察 效果为
- matplotlib绘图3
#scatter fig=plt.figure() ax=fig.add_subplot(3,3,1)#3行3列 第一个图 n=128 X=np.random.normal(0,1,n) Y=np.r ...
- visual studio 和 sql server 的激活密钥序列号
VS2010: YCFHQ-9DWCY-DKV88-T2TMH-G7BHP VS2013: BWG7X-J98B3-W34RT-33B3R-JVYW9 VS2015: 专业版:HMGNV-WCYXV- ...
- 使用nmon进行系统监控
一.下载并安装: 下载地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download 下载版本:nmon16g_x86.tar.gz 不用的Li ...
- CSS实现水平垂直同时居中的6种思路
前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的6种思路 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style ...
- codeforces701C
They Are Everywhere CodeForces - 701C 大B,年轻的口袋妖怪训练师,找到了一个由 n 间从左向右的房间组成的大房子.你可以从街道里走入任何一间房子,也可以从任何一间 ...
- BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...
- 洛谷P2257 YY的GCD
今日份是数论 大概是..从小学奥数到渐渐毒瘤 那就简单列一下目录[大雾 同余 质数密度 唯一分解定理 互质 完全剩余系 简化剩余系 欧拉函数 逆元 斐蜀定理 阶(及其性质) 欧拉定理 费马小定理 原根 ...
- Java创建文件
public class FileTest { public static void main(String[] args) throws IOException { File file = new ...
- emWin 文字图形同时刷新导致图形显示异常
@2018-7-10 实现目标 一 BUTTON 控制文字图形的刷新切换,具体为 BUTTON 初次按下,文字显示为 “开始” .填充圆显示为绿色,再次按下,文字显示为 “停止” .填充圆显示为红色 ...