PHP的Closure

32 篇文章 0 订阅

PHP的Closure

参考博客

直接上代码最直接,看过效果之后就比较容易理解它是干什么的了。

class A
{
    private $name = '王力宏';
    protected $age = '30';
    private static $weight = '70kg';
    public $address = '中国';
    public static $height = '180cm';
}

试问,下面这段代码会不会出错:

$wrongFunction=function (){
    return A::$weight;
};

肯定会报错,因为$weigth是私有属性,只能在其类内部访问,那么可以在外部访问吗?可以,采用下面这种方法就行:

$private = function () {
    return self::$weight;
};
// 重点内容在这里
$weight = Closure::bind($private, null, A::class);

echo $weight();
// 70kg

在开始讲原理前,先说说Closure::bind方法3个参数的含义:

  1. 闭包函数的变量名
  2. 其中所使用到的对象实例。如果不需要实例,就传入null
  3. 实例对应的类名称

然后Closure::bind的作用就很简单了,就是将这个闭包函数放到实例对象中去,这样就可以访问到其中的privateprotected属性和方法了。

有了这个基础概念之后,就可以看一个更加简单的例子了:

$privateFunction = function () {
    // 注意看这里用的是 $this
    return $this->name ;
};

$name = Closure::bind($privateFunction, new A(), A::class);

echo $name().PHP_EOL;

这里将闭包函数$privateFunction塞进了类名为A::class的实例化类new A()中。


Closure的类实现原理我暂时还不知道,之后有机会再深入吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值