php-----匿名函数类Closure类的使用

背景:

上次看了下composer源码,发现了一处使用匿名函数的地方,由于对匿名函数使用的比较少,所以当时还是还有点不懂,今天练习了下匿名函数的使用方法,composer中的代码如下:

public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInitf9a4edff7ca5d83a52a9242e688ac24a::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInitf9a4edff7ca5d83a52a9242e688ac24a::$prefixDirsPsr4;

        }, null, ClassLoader::class);
    }

上述返回了一个匿名函数,匿名函数通过用use关键字引入加载器,目的是让loader加载器的相关映射配置信息初始化,当时没搞懂bind()函数的最后一个参数是用来干啥的,今天试了一下,大概是如下代码如下。

<?php

class person
{
   public static $age = 26;
   public $name ='哈哈';
   private $zhiye = '代码狗';

   public function getDesc()
   {
       return '姓名:'.$this->name.'; 年龄:'.self::$age.'; 职业:'.$this->zhiye;
   }

   protected function getZhiYe()
   {
        return $this->zhiye;
   }

   private function getName()
   {
        return $this->name;
   }
}

//需要绑定到匿名函数的对象,此处就是将匿名函数中的$this变量赋值为person类的实例
$fn = \Closure::bind(function(){
    echo $this->name;
},new person());
call_user_func($fn);//将匿名函数当做回调函数调用


//如果匿名函数中需要访问类的静态变量或者类的受保护、私有的静态属性或者方法,则必须将第三个参数设置为类的名称
$fn = \Closure::bind(function(){
    echo self::$age;
},null,'person');
call_user_func($fn);

$fn = \Closure::bind(function(){
    echo $this->zhiye;
},new person(),'person');
call_user_func($fn);

$fn = \Closure::bind(function(){
    echo $this->getName();
},new person(),'person');
call_user_func($fn);

 

posted @ 2018-04-14 12:02  rcj_飞翔  阅读(118)  评论(0)    收藏  举报