ホームページ バックエンド開発 PHPチュートリアル 無名関数(クロージャ機能)からPHPデザインパターンコンテナパターンへ

無名関数(クロージャ機能)からPHPデザインパターンコンテナパターンへ

Apr 11, 2019 am 11:24 AM
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 '这里是闭包测试函数体';
}
ログイン後にコピー

上記のコードの 3 つの例では、匿名関数はパラメータを渡しません。匿名関数は JavaScript で頻繁に使用され、パラメータは親関数 変数はサブ関数内で直接使用できますが、PHP 言語ではこれが許可されていないため、同じ目的を達成するには use ($var) キーワードを使用する必要があります (コード内での使用方法に注意してください)。上記のコードの例 3 に次の変更を加えます。

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

上記のコードの例 2 では、 use キーワードを使用して、親関数の外部変数への無名関数の参照を実現することもできます。 。これらのサンプル コードでの匿名関数とクロージャ機能の使用は、概念を理解するためだけであり、実際的な意味はあまりありません。クロージャには多くの用途があり、最も一般的には PHP のコンテナ モードの依存性注入 (DI) で使用されます。フレームワーク。

PHP オブジェクト指向コンテナ パターン

名前が示すように、コンテナは物を保存するために使用されます。実際には、コンテナへのアクセスに特に使用されるクラスを宣言します。この場合、依存関係をコンテナにバインドし、コンテナから依存関係を取得するには、コンテナ内に少なくとも 2 つのコア メソッドが必要です。コンテナは依存関係管理ツールであると言え、サービス コンテナと呼ばれることもあります。

/* 声明一个简单的容器类 */
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の2つのサービスを登録したコンテナの利用方法で、依存するストレージメソッドとして匿名関数を使用し、$container->set()を実行しています。サービスを登録するためにメソッドが呼び出されます。この時点では実際にはインスタンス化されませんが、依存関係を取得するために $container->get() メソッドが呼び出されたときに匿名関数が実行され、インスタンス化されたオブジェクトが返されます。これにより、オンデマンドのインスタンス化、使用されない場合はインスタンス化されないため、プログラムの動作効率が向上します。

以上が無名関数(クロージャ機能)からPHPデザインパターンコンテナパターンへの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ 匿名関数の使用法と特徴 C++ 匿名関数の使用法と特徴 Apr 19, 2024 am 09:03 AM

ラムダ式とも呼ばれる匿名関数は、名前を指定せず、1 回限りの使用または関数ポインターを渡すために使用される関数です。機能には、匿名性、ワンタイム使用、クロージャ、戻り値の型推論が含まれます。実際には、ソートやその他の 1 回限りの関数呼び出しによく使用されます。

Golang関数における匿名関数適用シナリオの分析 Golang関数における匿名関数適用シナリオの分析 May 16, 2023 pm 10:51 PM

最新のプログラミング言語として、Golang (Go 言語とも呼ばれる) には多くの強力な機能があります。その中でも匿名関数はGolangにおいて非常に重要な概念であり、様々なシーンで広く使われています。この記事では、Golang 関数の匿名関数の適用シナリオを深く分析します。イベント ハンドラー イベント ハンドラーでは、匿名関数は非常に便利で実用的なツールです。カスタム ロジックは、funcmain(){bt などの匿名関数を通じてイベント ハンドラーに渡すことができます。

PHP7 の匿名関数とクロージャを使用して、より柔軟なコード ロジック処理を実現するにはどうすればよいですか? PHP7 の匿名関数とクロージャを使用して、より柔軟なコード ロジック処理を実現するにはどうすればよいですか? Oct 21, 2023 am 10:21 AM

PHP7 の匿名関数とクロージャを使用して、より柔軟なコード ロジック処理を実現するにはどうすればよいですか? PHP7 より前は、関数を使用して特定のロジック部分をカプセル化し、コード内でこれらの関数を呼び出して特定の関数を実装することがよくありました。ただし、コード内に一時的なロジック ブロックを定義する必要がある場合があります。これらのロジック ブロックは独立した関数を作成する必要がなく、同時にコードにあまりにも多くのグローバル変数を導入したくありません。 PHP7 では、この問題をうまく解決できる匿名関数とクロージャが導入されています。無名関数とは名前のない関数です

Golang の匿名関数は複数の値を返すことができますか? Golang の匿名関数は複数の値を返すことができますか? Apr 13, 2024 pm 04:09 PM

はい、Go 言語の匿名関数は複数の値を返すことができます。構文: func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//関数本体}。使用法: 戻り値を受け取るには := 演算子を使用し、複数の値を返すには return キーワードを使用します。

PHP8.0の匿名関数 PHP8.0の匿名関数 May 14, 2023 am 08:31 AM

PHP8.0 は、PHP プログラミング言語の最新バージョンです。重要な更新の 1 つは、匿名関数の改善と機能強化です。匿名関数 (クロージャとも呼ばれます) は、実行時に動的に作成して他の関数に渡したり、変数に格納したりできる特殊なタイプの関数です。 PHP では、匿名関数は高度なプログラミングや Web 開発にとって重要です。 PHP8.0 は、匿名関数をより柔軟で使いやすくする新しい構文と機能をいくつか提供します。更新内容の一部は次のとおりです: PHP8.0 の関数パラメータの型宣言、

PHP7 の匿名関数とクロージャを使用して、より柔軟で再利用可能なコード ロジックを実現するにはどうすればよいでしょうか? PHP7 の匿名関数とクロージャを使用して、より柔軟で再利用可能なコード ロジックを実現するにはどうすればよいでしょうか? Oct 24, 2023 am 10:30 AM

PHP7 の匿名関数とクロージャを使用して、より柔軟で再利用可能なコード ロジックを実現するにはどうすればよいでしょうか? PHP プログラミングの世界では、匿名関数とクロージャは非常に貴重で強力なツールです。 PHP7 では、匿名関数とクロージャをより便利かつ柔軟に使用できるようにするいくつかの新しい言語機能が導入されています。この記事では、PHP7 の匿名関数とクロージャを使用して、より柔軟で再利用可能なコード ロジックを実現する方法を紹介し、いくつかの具体的なコード例を示します。 1. 無名関数 無名関数とは、名前のない関数です。 PHPでは匿名を使用できます

Python ラムダ式: プログラミングを簡単にする Python ラムダ式: プログラミングを簡単にする Feb 19, 2024 pm 09:54 PM

Python のラムダ式は、式を変数に格納し、その値を返す小さな匿名関数です。ラムダ式は、別の関数を作成することで実行できる単純なタスクを実行するためによく使用されますが、ラムダ式を使用すると、コードがより簡潔で読みやすくなります。 Lambda 式の構文は次のとおりです。 lambdaarguments:expressionarguments は Lambda 式によって受け取られるパラメータ リストで、expression は実行する必要があるコードを含む Lambda 式の本体です。たとえば、次のラムダ式は 2 つの数値を加算し、その合計を返します: lambdax,

Python ラムダ式: 省略、簡潔、強力 Python ラムダ式: 省略、簡潔、強力 Feb 19, 2024 pm 08:10 PM

pythonLambda 式は、簡潔で読みやすく、使いやすいコードを作成するための強力で柔軟なツールです。これらは、他の関数に引数として渡したり、変数に保存したりできる匿名関数をすばやく作成するのに最適です。 Lambda 式の基本構文は次のとおりです。 lambdaarguments:expression たとえば、次の Lambda 式は 2 つの数値を加算します: lambdax,y:x+y この Lambda 式は、次のように引数として別の関数に渡すことができます。 defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2) この例では

See all articles