您现在的位置是:首页 > PHP框架交流PHP框架交流
PHP8.1新特性 First-class 可调用(callable)语法
上善若水2024-03-05 17:31:49【PHP框架交流】 113人已围观
简介PHP8.1新特性First-class可调用(callable)语法官方教程https://www.php.net/manual/zh/functions.first_class_calla
PHP8.1新特性枚举 First-class 可调用(callable)语法
官方教程https://www.php.net/manual/zh/functions.first_class_callable_syntax.php
- 简单案例
//旧版本写法
$closure=Closure::fromCallable('strlen');
echo $closure('foo'); // 3
//新版本写法
$closure = strlen(...);
echo $closure('foo'); // 3
$exc = new Exception('我是测试报错信息' . PHP_EOL);
//旧版写法
$closure = Closure::fromCallable([$exc, 'getMessage']);
echo $closure();
//新版写法
$closure = $exc->getMessage(...);
echo $closure();
//匿名函数
$function = function() {};
$callable = $function(...);
限制
不允许对象实例化
这个First-class callable语法不支持使用新构造实例化新对象。此行为类似于Closure::fromCallable。
$callable = new SplFixedArray(...);
//Fatal error: Cannot create Closure for new expression in ... on line ...
不允许nullsafe方法
该语法不允许nullsafe方法,因为它不能保证可调用。
$test?->doSomething(...);
//Fatal error: Cannot combine nullsafe operator with Closure creation in ... on line
注解参数
使用该语法不能声明注解
#[Attribute(...)]
class Test {}
//Fatal error: Cannot create Closure as attribute argument in ... on line ...
Callable 作用域
一个 First-class callable 被创建时,它也同时继承了创建该callable的调用栈的作用域。
function shout(): void {
$value = 'Banana';
echo $value;
}
$value = 'Apple';
$callable = shout(...);
$callable(); // Banana
因为First-class callable 有作用域,因此可以返回一个 callable 来调用私有方法,只要它是从对象作用域内返回的。
class Clock {
public function getClockCallable(): callable {
return $this->getTime(...);
}
private function getTime(): int {
return time();
}
}
$clock = new Clock();
$clock_callback = $clock->getClockCallable();
echo $clock_callback();
//注意,Clock::getClockCallable 返回了一个 callable,该 callable 调用了私有方法 getTime。现有使用数组创建callable的语法不允许调用私有方法:
class Clock {
public function getClockCallable(): callable {
- return $this->getTime(...);
+ return [$this, 'getTime'];
}
private function getTime(): int {
return time();
}
}
$clock = new Clock();
$clock_callback = $clock->getClockCallable();
echo $clock_callback();
Tags: PHP8.1
很赞哦! (0)
下一篇: PHP8.1新特性 初始化器
相关文章
随机图文
-
5个最搞笑儿童笑话:欢迎收听肖邦和贝多芬合奏的东北大秧歌
1.一天,一对父子在收音机旁听音乐。儿子说:'萧邦的曲子真好听。'父亲大叫道:'笨蛋,这明明是贝多芬的交响曲。'就在他们争论不休时,收音机里的播音员说:'您刚才收听到的是东北大秧歌。'2.儿子:'妈,什么叫唯唯诺诺的人?'妈妈:'就是那些从不发表自己的意见,嘴里常说'对,对,对'的人。孩子他爸,我说得对吗?'爸爸:'对,对,对。'儿童笑话3.本地电视一个节目,主持人 -
php yar扩展实现rpc调用
php使用yar使用扩展进行rpc调用,以最大程度实现程序的解耦,类似java微服务互相调用.是一个不错的方式,简单使用rpc使用.yar使用文档:https://www.php.net/manual -
幽默笑话:小时候的一个夏天,家里装了空调
1、给幼儿园的儿子买了一本小小的字典,准备教他怎么用。儿子很喜欢字典,走到哪带到哪,我问他:儿子,你大字不认识几个,怎么随身带着字典啊?儿子说:看以后幼儿园谁敢欺负我?谁欺负我,我拍他!2、媳妇是个急脾气,她让我帮她打印一张美颜照片,看着打印机里的相纸哼哼唧唧地蜗速往出爬,媳妇伸手往出慢慢拉,照片里的她下巴都被拉长了。。3、还在睡觉,电话响了,你不知道今天要上班吗?一看来电显示,我急忙跳下 -
你能够对我笑一下吗?
1、 美男,有男朋友吗,没有的话,介不介意有一个,有的话,介不介意换一个,不换啊,介不介意多一个? 2、 你晓得我烧烤的时分先烤甚么吗? 羊肉串,面筋… (烤)思索你 3、 哎,你额头上有个印记啊 啊,哪有啊 你打开头发看一下 (趁她扒开头发亲她一下) 是我的唇印啦! 4、 你能够对我笑一下吗? 为何? 我这杯咖啡忘放糖了! 5、 (一同喝工具)好甜啊! 也不怎样甜啊! 我说的是你! 6、 你晓得最幸运的数字是几吗? 8?6? 都不合错误,是5 为何? 你把手伸出看看,(然后你和她十