0

0

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

藏色散人

藏色散人

发布时间:2019-04-11 11:24:29

|

3357人浏览过

|

来源于cnblogs

转载

匿名函数(闭包函数)

匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用。具体的使用见以下示例代码:

/* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */
$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免费学习笔记(深入)”;

PHP 面向对象之容器模式

迷你天猫商城
迷你天猫商城

迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。所有页面均兼容IE10及以上现代浏览器。部署方式1、项目

下载

顾名思义,容器就是用来存放东西的,其实就是声明一个类,专门用来存取对象实例,既然如此,那么容器里至少要有两个核心方法,以实现绑定依赖到容器和从容器获取依赖。容器可以说是一个依赖管理工具,有时候也叫做服务容器。

/* 声明一个简单的容器类 */
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 方法用于获取依赖。容器存储依赖的方式有很多,以下示例代码以匿名函数的方式作为说明。

/* 数据库连接类 */
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速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2544

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1609

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1500

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1446

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 11.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号