您现在的位置是:首页 > 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

  1. 简单案例
//旧版本写法
$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)

文章评论

站点信息

  • 建站时间:2019-10-24
  • 网站程序:Thinkphp6 Layui
  • 文章统计247篇文章
  • 标签管理标签云
  • 统计数据cnzz统计
  • 微信公众号:扫描二维码,关注我们