PHP 7のClosure::call()


Closureクラス:匿名関数(PHP 5.3に導入)は、このタイプのオブジェクトを生成します.クラスをクラスまたはオブジェクトにバインドし、カスタムメソッドをクラスまたはオブジェクトに動的に追加できます.
php 7以前に使用した方法
  • Closure::bind:指定した$thisオブジェクトとクラスの役割ドメインをバインドする閉パッケージをコピーします.この方法はClosure::bindTo()の静的バージョン
  • です.
  • Closure::bindTo:現在の閉パッケージオブジェクトをコピーし、指定した$thisオブジェクトとクラスの役割ドメインをバインドします.現在のオブジェクトの関数体と同じ変数でバインドされている匿名関数を作成して返しますが、異なるオブジェクトをバインドしたり、新しいクラスの役割ドメインをバインドしたりできます.

  • php 7追加
  • Closure::call():メソッドは、一時的にバインドされたオブジェクト範囲として追加され、メソッドを閉じて簡単に呼び出すことができます.その性能はPHP 5に比べて5.6 bindToはずっと速いです.
  • //bind.php
    <?php
    /** * Created by PhpStorm. * User: bee * Date: 2016/4/24 * Time: 22:35 */
    class A {
        private static $sta = 1;
        private $com = 2;
    }
    $cl1 = static function() {
        return A::$sta;
    };
    $cl2 = function() {
        return $this->com;
    };
    
    $bcl1 = Closure::bind($cl1, null, 'A');
    $bcl2 = Closure::bind($cl2, new A(), 'A');
    echo $bcl1(), "
    "
    ; echo $bcl2(), "
    "
    ;
    <?php
    //bindTo.php
    /** * Created by PhpStorm. * User: bee * Date: 2016/4/24 * Time: 22:35 */
    class A {
        function __construct($val) {
            $this->val = $val;
        }
        function getClosure() {
            //returns closure bound to this object and scope
            return function() { return $this->val; };
        }
    }
    
    $ob1 = new A(1);
    $ob2 = new A(2);
    
    $cl = $ob1->getClosure();
    echo $cl(), "
    "
    ; $add = function(){ return $this->val+1; }; $cl = $add->bindTo($ob2); // call , () echo $cl(), "
    "
    ;
    <?php
    //call.php
    /** * Created by PhpStorm. * User: bee * Date: 2016/4/24 * Time: 22:35 */
    class Value {
        protected $value;
    
        public function __construct($value) {
            $this->value = $value;
        }
    
        public function getValue() {
            return $this->value;
        }
    }
    
    $three = new Value(3);
    $four = new Value(4);
    
    $closure = function ($delta) { return $this->getValue() + $delta; };
    //     ,       ()
    echo $closure->call($three, 3);
    echo $closure->call($four, 4);