您现在的位置是:首页 > PHP框架交流PHP框架交流
PHP8.1新特性 First-class 可调用(callable)语法
上善若水2024-03-05 17:31:49【PHP框架交流】
912人已围观
简介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新特性 初始化器
相关文章
随机图文
sql优化 GROUP BY多字段分组 分页查询速度慢
项目中遇到一个网页十分的卡慢,逐条排查,将sql放进去执行,执行时间居然高达19秒,怪不得慢,于是请教大佬,最后sql控制在1到两秒之间,现在想想,不同的写法,sql的执行效率真是天差地别呀!首先我们springboot mybatis thymeleaf layui 个人博客源码分享
使用springbootmybatisthymeleaflayui将博客网站进行了重写,精简了些许内容,利用业余时间终于完成了博客的第一版,基本功能已经实现.或许还有很多需要完善的知识点.以后让人瞬间爆笑的笑话
1、“王爷,王妃被您送去快手已经三天了。”“她认错了吗?”“没有,王妃说花花世界迷人眼,没有实力你别赛脸,今朝你薄情无义把我放逐,他日我涅槃重生必把你铲除。送你一句话,铁汁,做王呢,是该傲,但是给你脸呢,你得要!”2、去掉一个最高温,去掉一个最低温,今天的天气预报播放完了!3、上课的时候,小明被老师叫起来答题,小明:谢邀。4、你要做自己杀手小张接到了这样的命令。5、一男Spring Data JPA数据操作总结. findById getOne findOne save delete 等
mybatis和SpringDataJPA基本上就是主要的数据库持久层的框架,本篇自己使用jpa的基本增删改查的方式帮助大家快速上手SpringDataJPA.本篇使用的springboot版