从匿名函数(闭包特性)到 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 ...
随机推荐
- ES6定型数组
前面的话 定型数组是一种用于处理数值类型(正如其名,不是所有类型)数据的专用数组,最早是在WebGL中使用的,WebGL是OpenGL ES 2.0的移植版,在Web 页面中通过 <canvas ...
- BZOJ3750[POI2015]Pieczęć——链表
题目描述 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要满足以下要求: ...
- LOJ116 有源汇有上下界最大流(上下界网络流)
考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...
- 【Linux】Centos配置ssh无密码登录
[测试环境] 刚好重新做mgr就搞下吧,主要论文好长~想多做几遍再看~ master1 192.168.13.111 master2 192.168.13.112 master3 192.168. ...
- hdu 3727 Jewel (可持久化线段树+bit)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3727 题意: 对一段序列进行四种操作: Insert x :在序列尾部插入一个x: Query_1 s ...
- Java OOM 常见情况
Java OOM 常见情况 原文:https://blog.csdn.net/qq_42447950/article/details/81435080 1)什么是OOM? OOM,全称“Out Of ...
- 自学工业控制网络之路1.5-典型的现场总线介绍DeviceNet
返回 自学工业控制网络之路 自学工业控制网络之路1.5-典型的现场总线介绍DeviceNet 2002年10月DeviceNet被批准为中国国家标准GB/T18858.3-2002,并于2003.4. ...
- sprintf-%s的用法
@2018-9-19 sprintf-%s的用法 #include <stdio.h> #include <string.h> char string[] = "I ...
- OneProxy 管理
-----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.168.1.1 192.168. ...
- vlc sdl2.0 播放示例
#include <stdio.h> #include <stdint.h> #include <math.h> #include <stdlib.h> ...