上海11选5分布走势图

php中的匿名函数,closure的介绍及使用

来源:襄阳艾特网络 2019-08-10 点击: 作者:艾特总编

匿名函数(在 PHP 5.3 中被引入),匿名函数在php使用目前为止并不多见,但是现在的很多框架中都能看到它的影子,如果不能对closure有一定的理解,对源码学习是一种阻碍。

上海11选5分布走势图对于闭包(也叫匿名)的理解,只要记住一点就可以了:匿名是没有明确的名字。

基本的声明:


  1.  
    $func = function(){
  2.  
    //do something。。。。。。
  3.  
    }; //切记这里要带分号
  4.  
     
  5.  
    echo $func();

也可以带上形参:


  1.  
    $func = function($param){
  2.  
    return $param;
  3.  
    };
  4.  
     
  5.  
    echo $func('test');

要使用外部变量怎么办? use 关键字


  1.  
    $num = 100;
  2.  
    $func = function () use ($num){
  3.  
    return ++$num;
  4.  
    };
  5.  
     
  6.  
    echo $func();

当然global也是可以的(不推荐)


  1.  
    $num = 100;
  2.  
    $func = function () {
  3.  
    global $num;
  4.  
    return ++$num;
  5.  
    };
  6.  
     
  7.  
    echo $func();

常规函数中调用匿名函数


  1.  
    function func($param){
  2.  
    $func = function() use ($param){
  3.  
    return ++$param;
  4.  
    };
  5.  
    return $func();
  6.  
    }
  7.  
     
  8.  
    echo func(100);

将匿名函数作为参数传入到函数中


  1.  
    function func1($callback_func){
  2.  
    $callback_func();
  3.  
    }
  4.  
    $func = function(){
  5.  
    echo "hello";
  6.  
    };
  7.  
    fucn1($func);

直接将匿名函数作为参数进行操作


  1.  
    function func2($callback_func){
  2.  
    $callback_func();
  3.  
    }
  4.  
    func2(function(){
  5.  
    echo "hello";
  6.  
    });

以上是匿名函数的大致使用方法,这里我要提醒大家需要注意的地方
当你 var_dump($func()) 的时候,会发现返回的是这样的结果 object(Closure)[25],说明它是一个对象变量。
既然它是一个变量,就要符合变量的使用规范,当你使用匿名函数的时候,必须要在使用前定义此匿名函数,
否则将出现notice错误,此变量不存在。

PHP Closure 类是用于代表匿名函数的类,匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象,Closure类摘要如下:


  1.  
    Closure {
  2.  
    __construct ( void )
  3.  
    public static Closure bind (Closure $closure , object $newthis [, mixed $newscope = 'static' ])
  4.  
    public Closure bindTo (object $newthis [, mixed $newscope = 'static' ])
  5.  
    }
  6.  
     
  7.  
    Closure::__construct — 用于禁止实例化的构造函数
  8.  
    Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。
  9.  
    Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域
  10.  
     
  11.  
     
  12.  
    除了此处列出的方法,还有一个 __invoke 方法。这是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用闭包对象的过程与它无关。
  13.  
     
  14.  
    参数说明:
  15.  
     
  16.  
    closure表示需要绑定的闭包对象。
  17.  
    newthis表示需要绑定到闭包对象的对象,或者NULL创建未绑定的闭包。
  18.  
    newscope表示想要绑定给闭包的类作用域,可以传入类名或类的示例,默认值是 'static', 表示不改变。
  19.  
     
  20.  
    返回值:成功时返回一个新的 Closure 对象,失败时返回FALSE
  21.  
    Closure::bind是Closure::bindTo的静态版本

  1.  
    class Animal {
  2.  
    public $cat = 'cat';
  3.  
    public static $dog = 'dog';
  4.  
    private $pig = 'pig';
  5.  
    private static $duck = 'duck';
  6.  
    }
  7.  
     
  8.  
    //不能通过 $this 访问静态变量
  9.  
    //不同通过 类名::私有静态变量,只能通过self,或者static,在类里面访问私有静态变量
  10.  
     
  11.  
    $cat = function() {
  12.  
    return $this->cat;
  13.  
    };
  14.  
     
  15.  
    $dog = static function () {
  16.  
    return Animal::$dog;
  17.  
    };
  18.  
     
  19.  
    $pig = function() {
  20.  
    return $this->pig;
  21.  
    };
  22.  
     
  23.  
    $duck = static function() {
  24.  
    //return Animal::$duck; 这样写,会报错,提示不能通过类名访问私有静态变量
  25.  
    return self::$duck; // return static::$duck
  26.  
    };
  27.  
     
  28.  
    $bindCat = Closure::bind($cat, new Animal(), 'Animal');
  29.  
    $bindCat2 = Closure::bind($cat, new Animal(), new Animal());
  30.  
    echo $bindCat() . PHP_EOL;
  31.  
    echo $bindCat2() . PHP_EOL;
  32.  
     
  33.  
    $bindDog = Closure::bind($dog, null, 'Animal');
  34.  
    $bindDog2 = Closure::bind($dog, null, new Animal());
  35.  
    echo $bindDog() . PHP_EOL;
  36.  
    echo $bindDog2() . PHP_EOL;
  37.  
     
  38.  
    $bindPig = Closure::bind($pig, new Animal(), 'Animal');
  39.  
    $bindPig2 = Closure::bind($pig, new Animal(), new Animal());
  40.  
    echo $bindPig() . PHP_EOL;
  41.  
    echo $bindPig2() . PHP_EOL;
  42.  
     
  43.  
    $bindDuck = Closure::bind($duck, null, 'Animal');
  44.  
    $bindDuck2 = Closure::bind($duck, null, new Animal());
  45.  
    echo $bindDuck() . PHP_EOL;
  46.  
    echo $bindDuck2() . PHP_EOL;
 

通过上面的例子,可以看出函数复用得,可以把函数挂在不同的类上,或者对象上。

总结:

  1. 闭包内如果用 $this, 则 $this 只能调用非静态的属性,这和实际类中调用原则是一致的,且 Closure::bind() 方法的第2个参数不能为null,必须是一个实例 (因为$this,必须在实例中使用),第三个参数可以是实例,可以是类字符串,或 static;
  2. 闭包内调用静态属性时,闭包必须声明为 static,同时Closure::bind()方法的第2个参数需要为null,因为 静态属性不需要实例,第3个参数可以是类字符串,实例,staic.

此作者的其它技术博文:

艾特网络签约襄阳送水网网站平台建设项目 艾特网络签约襄阳灵芝文化传媒相约红娘网站项目 艾特网络签约南漳竹林翠峰茶叶微信商城 艾特网络签约襄阳良程人力资源微信公众平台建设项目 企业网站设计规划和建设 导致网站不收录的原因有哪些? 百度只抓取网站上海11选5分布走势图如何解决? 如何选择一个靠谱的建站公司? 模板建站和定制建站的区别,这是最全的答案。 网站排名不稳定到底是什么原因? 上海11选5分布走势图襄阳网站建设公司哪家好?如何选择? 什么样的网站结构,更有利于网站的优化排名? 网站开发中,三网合一网站是什么意思? 如何打造一个极简风格的企业网站 企业网站改版需要注意的几点事宜 上海11选5分布走势图网站建设怎样去遵循SEO标准,让网站更符合搜索引擎的排名 上海11选5分布走势图更新网站文章时需要注意的几个问题 免费建站是否可信?是馅饼还是深坑? 企业不做网站建设会有哪些损失? 域名是否必须备案?不备案有哪些影响?

案例推荐

上海11选5开奖结果 上海11选5 悠洋棋牌 上海11选5 上海11选5走势图 上海11选5走势图 上海11选5走势图 上海11选5APP 上海11选5 上海11选5开奖结果