php Closure类 闭包 匿名函数

php匿名函数

   匿名函数就是没有名称的函数。匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递。不过匿名函数仍是函数,因此可以调用,还可以传入参数。匿名函数特别适合作为函数或方法的回调。

  如:

    $f = function($a){

        return $a;

      };

    echo $f('hello');  //输出 hello

  上面的匿名函数本身没有名字  为了方便调用把匿名函数赋值给变量;

  (function($str){ return $str; })('hello');  //输出hello

  匿名函数还可作为参数使用;

 

php闭包

   闭包是指在创建时封装周围状态的函数。即使闭包所在的环境不存在了,闭包中封装的状态依然存在。

  注意:“”理论上讲,闭包和匿名函数是不同的概念。不过,PHP将其视作相同的概念。

  PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是 伪装成函数的对象(Closure类的实例) 。

    
    $closure = function($name){
      return sprintf("Hello %s", $name);
    }
  echo $closure("jerry");
  // 检测$closure变量是否是一个闭包
  var_dump($closure instanceof Closure);        
    说明:我们之所以能够调用 $closure 变量,是因为这个变量的值是一个闭包,而且闭包对象实现了 __invoke() 魔术方法(把一个对象当成函数执行)。只要变量名后有 () ,PHP就会查找并调用 __invoke() 方法。

  使用use 关键字把变量附加闭包上时,附加的变量会记住附加时赋给它的值。   

    function Car ($name){
         return function($statu)use($name){
         return sprintf("Car %s is %s", $name, $statu);
         };
    }
    // 将车名封装在闭包中
    $car = Car("bmw");
    // 调用车的动作
    echo $car("running");
    // 输出--> "Car bmw is running"

     注意:使用 use 关键字可以把多个参数传入闭包,此时要像PHP函数或方法的参数一样,使用逗号分隔多个参数。

  使用 bindTo() 方法附加闭包的状态

    bindTo() 方法为闭包增加了一些有趣的潜力。我们可以使用这个方法把 Closure 对象的内部状态绑定到其它对象上。

    bindTo() 方法的第二个参数很重要,其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员变量。

 

Closure类

 1.简介

  用于代表 匿名函数 的类.匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情。自 PHP 5.4 起,这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制。

  除了此处列出的方法,还有一个 __invoke 方法。这是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用匿名函数的过程与它无关。

     2.用法

  function B(Closure $callback)
  {
    return $callback();
  }

  此处若调用B函数  传入参数不能是有名字的函数  即必须是匿名函数;

  

  绑定的概念

 

    上面的例子的Closure只是全局的的匿名函数,好了,我现在想指定一个类有一个匿名函数。也可以理解说,这个匿名函数的访问范围不再是全局的了,是一个类的访问范围。

 

    那么我们就需要将“一个匿名函数绑定到一个类中”。

  使用 bindTo() 方法附加闭包的状态

    bindTo() 方法为闭包增加了一些有趣的潜力。我们可以使用这个方法把 Closure 对象的内部状态绑定到其它对象上。

    bindTo() 方法的第二个参数很重要,其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员变量。

 

 

posted @ 2018-04-18 10:41  初心未泯  阅读(253)  评论(0编辑  收藏  举报