您现在的位置是:首页 > PHP框架交流PHP框架交流
PHP8.1新特性 First-class 可调用(callable)语法
上善若水2024-03-05 17:31:49【PHP框架交流】
840人已围观
简介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新特性 初始化器
相关文章
随机图文
php 中??双问号 与?:冒号问号对比
php 中??双问号 与?:冒号问号对比,在phpstorm中使用三元运算符的时候推荐我使用?:代替特此在phpstorm进行了对比. $s1= '' ?: 'docker 部署thinkphp6 项目(strawberry) 基于官方镜像php nginx mysql部署
使用docker部署thinkphp6项目,这里采用php7.4+mysql5.7+nginx进行,每个服务为单独的一个容器,本人电脑不是专业版,采用centos虚拟机来运行docker,而非winspriingboot之mybatis 一对多关联查询
在接触mybatis时,只会使用mapper提供的单表查询,关联查询需要配置xml完成,整理了使用@Results注解完成表的关联查询.参考博客:https://blog.csdn.net/zhousPHP8.1新特性枚举 枚举的简单用法
PHP8.1新特性枚举枚举的简单用法1.枚举类型的定义 enumStatus:int { caseDraft=1; casePublished=2; case