您现在的位置是:首页 > PHP框架交流PHP框架交流
PHP8.1新特性 First-class 可调用(callable)语法
上善若水2024-03-05 17:31:49【PHP框架交流】 657人已围观
简介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新特性 初始化器
相关文章
随机图文
-
人均GDP过万美元在世界上到底是什么水平?
2019年1月17日,国家统计局发布数据,2019年我国国内生产总值(GDP)接近100万亿元大关。按年平均汇率折算,人均GDP达10276美元,跨上1万美元台阶。很多朋友们都关心,人均GDP1万美元 -
开怀一笑,让你开心的幽默故事三则
1.信不信由你 现在让骗子闹的人们对任何事情都不敢轻信,真是多次被忽悠,遇事要三思。如果拿着一瓶矿泉水告诉你,这是某某大师施过法术的,可以益寿延年,你肯定不信,如果说这瓶水经过高科技纳米技术处理,又由美国科学院认证,你八成就信了。 你爱人买了件连衣裙,大家都说她穿上真好看,她不一定信,如果有一个说她穿上不好看,她肯定信了。 明星访谈,说他们夫妻如何相亲相爱,你大概不太相信,如果有人说他们俩闹 -
PHP8.1新特性 Final 类常量
PHP8.1新特性 Final 类常量 大家都知道cost修饰的常量是不可以改变的,然而再继承中却可以改变,新版的final就解决这个问题。旧版写法 class Foo { public co -
武汉江滩芦苇荡美景
不似桂花那般清香,不似银杏那般璀璨,不似红枫那般热烈,秋冬的芦苇,却是另一番迷人景象。 每年的11至12月,洁白的芦花傲立于天宇之间,与蓝天互相映衬,远望去,芦浪翻滚,盛开出油画般的美丽。湖北有哪