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

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

Apr 11, 2019 am 11:24 AM
corak reka bentuk php fungsi tanpa nama

匿名函数(闭包函数)

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

/* 示例一:声明一个简单匿名函数,并赋值给一个变量,通过变量名调用这个匿名函数 */
$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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penggunaan dan ciri-ciri fungsi tanpa nama C++ Penggunaan dan ciri-ciri fungsi tanpa nama C++ Apr 19, 2024 am 09:03 AM

Fungsi tanpa nama, juga dikenali sebagai ungkapan lambda, ialah fungsi yang tidak menentukan nama dan digunakan untuk kegunaan sekali atau untuk menghantar penunjuk fungsi. Ciri termasuk: tidak mahu dikenali, penggunaan sekali sahaja, penutupan, inferens jenis pulangan. Dalam amalan, ia sering digunakan untuk mengisih atau panggilan fungsi satu masa yang lain.

Analisis senario aplikasi fungsi tanpa nama bagi fungsi Golang Analisis senario aplikasi fungsi tanpa nama bagi fungsi Golang May 16, 2023 pm 10:51 PM

Sebagai bahasa pengaturcaraan moden, Golang (juga dikenali sebagai bahasa Go) mempunyai banyak ciri yang berkuasa. Antaranya, fungsi tanpa nama merupakan konsep yang sangat penting di Golang dan digunakan secara meluas dalam pelbagai senario. Dalam artikel ini, kami akan menganalisis secara mendalam senario aplikasi fungsi tanpa nama dalam fungsi Golang. Pengendali Acara Dalam pengendali acara, fungsi tanpa nama adalah alat yang sangat mudah dan praktikal. Logik tersuai boleh dihantar kepada pengendali acara melalui fungsi tanpa nama, seperti: funcmain(){bt

Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai pemprosesan logik kod yang lebih fleksibel? Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai pemprosesan logik kod yang lebih fleksibel? Oct 21, 2023 am 10:21 AM

Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai pemprosesan logik kod yang lebih fleksibel? Sebelum PHP7, kami sering menggunakan fungsi untuk merangkum sekeping logik tertentu, dan kemudian memanggil fungsi ini dalam kod untuk melaksanakan fungsi tertentu. Walau bagaimanapun, kadangkala kita mungkin perlu menentukan beberapa blok logik sementara dalam kod ini tidak perlu mencipta fungsi bebas, dan pada masa yang sama, kita tidak mahu memperkenalkan terlalu banyak pembolehubah global ke dalam kod. PHP7 memperkenalkan fungsi dan penutupan tanpa nama, yang boleh menyelesaikan masalah ini dengan baik. Fungsi tanpa nama ialah fungsi tanpa nama

Bolehkah fungsi tanpa nama Golang mengembalikan berbilang nilai? Bolehkah fungsi tanpa nama Golang mengembalikan berbilang nilai? Apr 13, 2024 pm 04:09 PM

Ya, fungsi tanpa nama dalam bahasa Go boleh mengembalikan berbilang nilai. Sintaks: func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//Function body}. Penggunaan: Gunakan operator := untuk menerima nilai pulangan menggunakan kata kunci pulangan untuk mengembalikan berbilang nilai.

Fungsi tanpa nama dalam PHP8.0 Fungsi tanpa nama dalam PHP8.0 May 14, 2023 am 08:31 AM

PHP8.0 ialah versi terkini bahasa pengaturcaraan PHP. Satu kemas kini penting ialah penambahbaikan dan peningkatan kepada fungsi tanpa nama. Fungsi tanpa nama (juga dipanggil penutupan) ialah jenis fungsi khas yang boleh dibuat secara dinamik pada masa jalan dan dihantar ke fungsi lain atau disimpan dalam pembolehubah. Dalam PHP, fungsi tanpa nama adalah penting untuk pengaturcaraan lanjutan dan pembangunan web. PHP8.0 menyediakan beberapa sintaks dan ciri baharu yang menjadikan fungsi tanpa nama lebih fleksibel dan lebih mudah untuk digunakan. Beberapa kemas kini adalah seperti berikut: Taipkan pengisytiharan untuk parameter fungsi dalam PHP8.0,

Ungkapan Lambda Python: Menjadikan Pengaturcaraan Lebih Mudah Ungkapan Lambda Python: Menjadikan Pengaturcaraan Lebih Mudah Feb 19, 2024 pm 09:54 PM

Ungkapan Lambda python ialah fungsi kecil tanpa nama yang menyimpan ungkapan dalam pembolehubah dan mengembalikan nilainya. Ungkapan Lambda sering digunakan untuk melaksanakan tugas mudah yang boleh dicapai dengan menulis fungsi yang berasingan, tetapi ungkapan Lambda boleh menjadikan kod lebih ringkas dan boleh dibaca. Sintaks ungkapan Lambda adalah seperti berikut: lambdaarguments: expressionarguments ialah senarai parameter yang diterima oleh ungkapan Lambda dan ungkapan ialah badan ungkapan Lambda, yang mengandungi kod yang perlu dilaksanakan. Sebagai contoh, ungkapan Lambda berikut menambah dua nombor dan mengembalikan jumlahnya: lambdax,

Ungkapan Python Lambda: disingkatkan, ringkas, berkuasa Ungkapan Python Lambda: disingkatkan, ringkas, berkuasa Feb 19, 2024 pm 08:10 PM

ungkapan pythonLambda ialah alat yang berkuasa dan fleksibel untuk mencipta kod yang ringkas, boleh dibaca dan mudah digunakan. Ia bagus untuk mencipta fungsi tanpa nama dengan cepat yang boleh dihantar sebagai hujah kepada fungsi lain atau disimpan dalam pembolehubah. Sintaks asas ungkapan Lambda adalah seperti berikut: lambdaarguments:expression Contohnya, ungkapan Lambda berikut menambah dua nombor: lambdax,y:x+y Ungkapan Lambda ini boleh dihantar ke fungsi lain sebagai argumen seperti berikut: defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2)Dalam contoh ini

Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai logik kod yang lebih fleksibel dan boleh digunakan semula? Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai logik kod yang lebih fleksibel dan boleh digunakan semula? Oct 24, 2023 am 10:30 AM

Bagaimana untuk menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai logik kod yang lebih fleksibel dan boleh digunakan semula? Dalam dunia pengaturcaraan PHP, fungsi dan penutupan tanpa nama adalah alat yang sangat berharga dan berkuasa. PHP7 memperkenalkan beberapa ciri bahasa baharu yang menjadikan penggunaan fungsi dan penutupan tanpa nama lebih mudah dan fleksibel. Artikel ini akan memperkenalkan cara menggunakan fungsi dan penutupan tanpa nama PHP7 untuk mencapai logik kod yang lebih fleksibel dan boleh digunakan semula, serta menyediakan beberapa contoh kod khusus. 1. Fungsi tanpa nama Fungsi tanpa nama ialah fungsi tanpa nama. Dalam PHP, anda boleh menggunakan tanpa nama

See all articles