php匿名関数(閉パッケージ)

2188 ワード

匿名関数は、関数を動的に作成し、変数に保存するために使用できます.栗を挙げます.
$func = function(){
    exit('Hello world!!');
};//      ;  
$func();

同等:
function func(){
    exit('Hello world!!');
}
func();

あまり珍しいところがないように見えますが、焦らないで、見続けてください.
function operate($operator){
    if($operator == "-"){
        return function($a,$b){
            return $a-$b;
        };
    }else{
        return function($a,$b){
            return $a+$b;
        };
    }
}
$subtraction = operate("-");
echo $subtraction(4,3);//1
$addition = operate("+");
echo $addition(1,2);//3

operate関数により,異なる関数を生成して結果として返すことができ,この結果を直接関数として呼び出すことができ,上のコードはそれぞれ減算演算と加算演算関数を動的に作成した.
実戦で使用されるテクニックを示します.
_factory[$id] = $value;
    }
    
    public function get($id){
        $value = $this->_factory[$id];
        return $value();
    }
}
class User{
    private $_username;
    function __construct($username="") {
        $this->_username = $username;
    }
    function getUserName(){
        return $this->_username;
    }
}
//      
$di = new Di();
$di->set("zhangsan",function(){
    return new User('  ');
});
$di->set("lisi",function(){
   return new User("  "); 
});
echo $di->get("zhangsan")->getUserName();
echo $di->get("lisi")->getUserName();

コードにはDiコンテナがあり、オブジェクトインスタンスを保存し、set()メソッドでサービスを登録し、get()メソッドでサービスを取得します.$di->set()を見たとき、匿名関数を使用し、zhangsanとlisiの2つのサービスを事前に登録しました.この2つのサービスはUserクラスのインスタンスであり、$di->setの場合は実際にはインスタンス化されていませんが、$di->get()の場合に匿名関数を実行してオブジェクトを返します.これにより、オンデマンドインスタンス化が実現され、インスタンス化されずに効率が向上します.
閉包特性:jsをよく書く学生はjsの閉包特性を知っているはずです.簡単に言えば、一つの関数で子関数を定義することができます.親関数の変数は子関数で直接使用することができますが、PHPの閉包はどう使いますか.少し違いがあります.
function func1($a){
    return function() use ($a){
        echo $a;
    };
}
$a = func1("a");
$a();//  a

外層変数を内層匿名関数に伝達したい場合はuse(変数)を使用します.閉パッケージの用途は多くの場所で使用でき、DIモードでよく見られる.