从匿名函数(闭包特性)到 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);    // 7
$sub = operate(‘-‘);
echo $sub(4, 3);    // 1
?
/* 示例三:匿名函数作为回调函数参数传入 */
function callback($callback){
    $callback();
}
function callback(){
    // 闭包测试函数
    echo ‘这里是闭包测试函数体‘;
}

  以上代码中的三个示例中,匿名函数都没有进行传参,我们知道在 JavaScript 中匿名函数用得很频繁,而且父函数中的参数变量在子函数中可以直接使用,但是 PHP 语言不允许这样做,需要用到 use ($var) 关键字(注意代码中的使用方式)实现同样的目的。针对上面代码中的示例三做如下修改:

/* 示例三修改:匿名函数作为参数传入,并且携带参数 */
function callback($callback) use ($content){
    $callback($content);
}
$content = ‘这里是闭包函数的输出内容‘;
function callback($content){
    // 闭包函数
    echo $content;
}

  以上代码中的示例二,也可以通过 use 关键字实现匿名函数对父函数外层变量的引用。这些示例代码中匿名函数和闭包特性的运用,只是为了理解概念,并没有多大的实战意义,闭包的用途有很多,常见的是用在 PHP 框架中容器模式的依赖注入(DI)中。

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;
    }
}

  以上代码就是一个简单的容器模式,其中的 set 方法用于注册依赖,get 方法用于获取依赖。容器存储依赖的方式有很多(具体参照笔记《PHP 面向对象之容器模式的依赖注入(DI)与控制反转(Ioc)》),以下示例代码以匿名函数的方式作为说明。

/* 数据库连接类 */
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() 方法获取依赖的时候才执行匿名函数,并将实例化对象返回,这样实现了按需实例化,不用则不实例化,提高了程序的运行效率。

参考文章出处:

  1、http://www.thinkphp.cn/topic/13624.html

  2、https://www.cnblogs.com/sweng/p/6430374.html

  3、http://www.jb51.net/article/114723.htm

  4、http://blog.csdn.net/realghost/article/details/35212285

  5、《跟兄弟连学 PHP》一书中《PHP 匿名函数和闭包》章节以及相关笔记

原文地址:https://www.cnblogs.com/sefablog/p/8118517.html

时间: 2024-08-08 13:56:55

从匿名函数(闭包特性)到 PHP 设计模式之容器模式的相关文章

js匿名函数闭包

函数声明: function functionName(arg0,arg1){ //函数体 } 函数表达式: var functionName = function(arg0,arg1){ //函数体 } 函数声明和函数表达式之间的主要区别是前者会在代码执行前被加载到作用域中,而后者是在代码执行到那一行的时候才会有定义.另一个区别是函数声明会给函数指定一个名字,而函数表达式则创建一个匿名函数,然后将这个函数赋给一个变量 1 递归 递归函数是在一个函数通过名字调用自身的情况下构成的,例如: fun

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

javascript匿名函数 闭包

匿名函数 (function(){                console.info("111111111");            })(); var my = (function(){                return "11111111";            })(); 函数里放匿名函数叫闭包 function my(){                return function(){                    retur

php : 匿名函数(闭包) [一]

摘自: http://www.cnblogs.com/starlion/p/3894578.html 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函数的参数值.(http://php.net/manual/zh/functions.anonymous.php) 匿名函数的定义: $closureFunc = function(){ .... }

PHP匿名函数(闭包)

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. 结合array_walk和匿名函数来实现一个结算功能 array_walk() 函数对数组中的每个元素应用回调函数.如果成功则返回 TRUE,否则返回 FALSE. 1 <?php 2 class anyMouseTest{ 3 //定义商品类型.价格 4 const IPHONE6_PRICE =

js:匿名函数/闭包前奏

js里面”万物皆对象“,函数同理 三种定义方式 a.传统的如同C语言一样的定义方式:function abc(){code} b.少见的定义方式:var abc = new Function('参数','代码');  //由此可见我们的function是构造函数Function的对象实例,即函数也是对象 c.匿名函数定义:var abc = function(){...} //写一个匿名函数,并让一个变量称为它的引用 对于匿名函数有很多奇技淫巧: 1.若是我们平时用a,b方法定义函数,实际调用的

PHP匿名函数(闭包函数)详解_php技巧 - PHP

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在PHP中匿名函数(Anonymous functions),也叫闭包函数( closures ),允许临时创建一个没有指定名称的函数.经常用作回调函数(callback)的参数. 当然,也有其他应用的情况. 注:php闭包是PHP5.3版本之后才有的 什么是闭包?闭包是可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量).“闭包

PHP函数(六)-匿名函数(闭包函数)

匿名函数能够临时创建一个没有名称的函数,常用作回调函数参数的值 <?php $test = function($a){ echo "Hello,".$a; }; $test("world"); ?> 一定要在匿名函数的结尾处加上分号 执行结果 回调函数将匿名函数做参数 <?php function callback($a){ $a(); } callback(function(){ //声明一个匿名函数并传给callback()函数 echo &q

PHP 闭包函数 Closures 匿名函数

/*  * 匿名函数   * 闭包函数(closures)  * 依靠匿名函数实现闭包  * 子函数可以使用父函数中的局部变量,这种行为就叫做闭包  * 连接闭包和外界变量的关键字 use  * 闭包的两个特点  * 1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态.  * 2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区.  * 闭包函数返回时,该函数内部变量处于激活状态,函数在栈区依然保留.  *   * 总结  * 1.闭包外层是个函数  * 2.闭包内部都有函数  *