从匿名函数(闭包特性)到 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 ...
随机推荐
- windows的cmd下的find命令比bash(win10下的Ubuntu的bash)下的grep比较
同样的一个catalina文件,windows的cmd下的find命令比bash下的grep要慢,windows确实占下风啊
- [安全]appscan 使用代理抓取其他客户端的请求
自己安全测试技能很低, 上级给的安全测试的任务给了自动化组的同事来做, 自己之前使用appscan的时候 只知道使用appscan的内置浏览器测试抓取请求 今天与自动化美女同事沟通发现有一个代理的功能 ...
- reshape、shuffle、save_weights
#-*- coding: utf-8 -*- import pandas as pd from random import shuffle import matplotlib.pyplot as pl ...
- mysql常用增删改查命令(纯纪录.orm用得基本功都没了。)
更新表数据: update table_name set xxx=xxx where condition; 增加字段: alter table table_name add field type ot ...
- webpack & bundle analyzer
webpack & bundle analyzer webpack bundle analyzer https://github.com/th0r/webpack-bundle-analyze ...
- Essential Phone PH1原生系统常见问题以及解答
*首先声明原生系统使用Google才是最好的体验. **如果下述问题有更好的解决方法,欢迎各种方式私信我. Q:为什么我的wifi显示无法连接到网络?为什么wifi有x号?如何去掉? A:因为原生系统 ...
- XQN number format
Q Numbers FormatAn XQN format number is an 1+X+N bit twos complement binary number; a sign bitfollow ...
- codeforces369A
Valera and Plates CodeForces - 369A Valera is a lazy student. He has m clean bowls and k clean plate ...
- liunx速查
文件和目录 Linux 主要目录速查表 /:根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 当在终端里输入 /home,其实是在告诉电脑,先从 /(根目 ...
- BZOJ1805[Ioi2007]Sail船帆——线段树+贪心
题目描述 让我们来建造一艘新的海盗船.船上有 N个旗杆,每根旗杆被分成单位长度的小节.旗杆的长度等于它被分成的小节的数目.每根旗杆上会挂一些帆,每张帆正好占据旗杆上的一个小节.在一根旗杆上的帆可以任意 ...