Von der anonymen Funktion (Abschlussfunktion) zum PHP-Entwurfsmuster-Containermuster

藏色散人
Freigeben: 2023-04-05 19:46:01
nach vorne
3081 Leute haben es durchsucht

Anonyme Funktion (Abschlussfunktion)

Anonyme Funktion, auch Abschlussfunktion genannt, ermöglicht die vorübergehende Erstellung einer Funktion ohne angegebenen Namen, der üblicherweise als Wert verwendet wird Der Parameter der Callback-Funktion kann auch als Wert einer Variablen verwendet werden. Informationen zur spezifischen Verwendung finden Sie im folgenden Beispielcode:

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

In den drei Beispielen des obigen Codes übergibt die anonyme Funktion keine Parameter. Wir wissen, dass anonyme Funktionen häufig in JavaScript verwendet werden und die Parameter in Variablen der übergeordneten Funktion können direkt in Unterfunktionen verwendet werden, die PHP-Sprache erlaubt dies jedoch nicht. Sie müssen das Schlüsselwort use ($var) verwenden (beachten Sie die Verwendung im Code), um den gleichen Zweck zu erreichen. Nehmen Sie die folgenden Änderungen an Beispiel 3 im obigen Code vor:

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

In Beispiel 2 im obigen Code kann die anonyme Funktion auch das Schlüsselwort use verwenden, um auf die äußere Variable der übergeordneten Funktion zu verweisen. Die Verwendung anonymer Funktionen und Abschlussfunktionen in diesen Beispielcodes dient lediglich dem Verständnis der Konzepte und hat keine große praktische Bedeutung. Abschlüsse haben viele Verwendungsmöglichkeiten und werden am häufigsten bei der Abhängigkeitsinjektion (DI) des Containermodus in PHP verwendet Rahmen.

Objektorientierter PHP-Containermodus

Wie der Name schon sagt, wird ein Container zum Speichern von Dingen verwendet. Tatsächlich dient er dazu, eine Klasse speziell für den Zugriff auf Objekte zu deklarieren In diesem Fall müssen mindestens zwei Kernmethoden im Container vorhanden sein, um Abhängigkeiten an den Container zu binden und Abhängigkeiten vom Container abzurufen. Ein Container kann als Abhängigkeitsverwaltungstool bezeichnet werden, manchmal auch als Dienstcontainer bezeichnet.

/* 声明一个简单的容器类 */
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;
    }
}
Nach dem Login kopieren

Der obige Code ist ein einfaches Containermuster, in dem die Set-Methode zum Registrieren von Abhängigkeiten und die Get-Methode zum Abrufen von Abhängigkeiten verwendet wird. Es gibt viele Möglichkeiten für Container, Abhängigkeiten zu speichern. Der folgende Beispielcode verwendet zur Veranschaulichung anonyme Funktionen.

/* 数据库连接类 */
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();
Nach dem Login kopieren

Der obige Code beschreibt die Verwendung des Containers, in dem zwei Dienste, db und session, registriert sind. Hier werden anonyme Funktionen als abhängige Speichermethoden und $container->set() verwendet. Die Methode wird aufgerufen, um den Dienst zu diesem Zeitpunkt zu registrieren. Die anonyme Funktion wird jedoch ausgeführt, wenn die Methode $container->get() aufgerufen wird, und das instanziierte Objekt wird zurückgegeben Instanziierung bei Bedarf und keine Instanziierung, wodurch die Betriebseffizienz des Programms verbessert wird.

Das obige ist der detaillierte Inhalt vonVon der anonymen Funktion (Abschlussfunktion) zum PHP-Entwurfsmuster-Containermuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!