Rumah > pembangunan bahagian belakang > tutorial php > 从匿名函数(闭包特性)到 PHP 设计模式之容器模式

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

藏色散人
Lepaskan: 2023-04-05 19:46:01
ke hadapan
3377 orang telah melayarinya

匿名函数(闭包函数)

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

/* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */
$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 '这里是闭包测试函数体';
}
Salin selepas log masuk

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

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

以上代码中的示例二,也可以通过 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;
    }
}
Salin selepas log masuk

以上代码就是一个简单的容器模式,其中的 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();
Salin selepas log masuk

以上代码是对容器的使用方法,其中注册了 db 和 session 两个服务,这里使用匿名函数作为依赖的存储方式,在调用 $container->set() 方法进行注册服务时实际上并没有进行实例化,而是在调用 $container->get() 方法获取依赖的时候才执行匿名函数,并将实例化对象返回,这样实现了按需实例化,不用则不实例化,提高了程序的运行效率。

Atas ialah kandungan terperinci 从匿名函数(闭包特性)到 PHP 设计模式之容器模式. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan