once()函数Memoization Helper即将加入 Laravel 11
Laravel  /  管理员 发布于 10个月前   194
once()函数最初是受到 Taylor Otwell 这条推文的启发,由 Spatie 制作成软件包,
现在已经进入了 Laravel 11 的核心框架。
https://github.com/spatie/once
https://laravel-news.com/laravel-11
这个辅助函数确保你无论调用多少次对象方法,都能得到相同的值。
当你有一些代码需要确保只运行一次时,once 函数就能派上用场。
让我们使用新的 Laravel 11 make:class Artisan 命令来演示它是如何工作的:
php artisan make:class OnceDemo
下面是 OnceDemo 代码,它演示了备忘录化的工作原理:
<?php
namespace App;
use Illuminate\Support\Str;
use Ramsey\Uuid\UuidInterface;
class OnceDemo
{
public function uuid(): UuidInterface
{
return Str::uuid();
}
public function uuidOnce(): UuidInterface
{
return once(fn (): UuidInterface => $this->uuid());
}
}
如果不使用 once() 助手而运行下面的 PHP 代码,每次方法调用都会得到一个新的 UUID:
$demo = new App\OnceDemo;
foreach (range(1,5) as $_) {
echo $demo->uuid() . "\n";
}
/*
9ee5dc3c-f34b-4424-827d-13b662bb0ce1
ad9cca9d-4e98-4307-994c-c610df7c70ac
d642bc9e-d8bb-4bfe-a647-78b555b22e1c
7968b5f2-80f4-40de-95e0-e1f576c37e60
78b69cbb-07b3-45a4-b77b-edefb16f2782
*/
但是,如果使用 once() 助手运行相同的代码,每次都会得到相同的结果:
$demo = new App\OnceDemo;
foreach (range(1,5) as $_) {
echo $demo->uuidOnce() . "\n";
}
/*
5cdfa44b-5ae5-4b0f-8a6f-4b167307fa05
5cdfa44b-5ae5-4b0f-8a6f-4b167307fa05
5cdfa44b-5ae5-4b0f-8a6f-4b167307fa05
5cdfa44b-5ae5-4b0f-8a6f-4b167307fa05
5cdfa44b-5ae5-4b0f-8a6f-4b167307fa05
*/
在我们的演示示例中,该方法将始终返回相同的对象实例,您可以验证这一行为:
$demo = new App\OnceDemo;
foreach (range(1,5) as $_) {
echo spl_object_id($demo->uuidOnce()) . "\n";
}
/*
5075
5075
5075
5075
5075
*/
在运行测试时,必须在每次测试后清除 memoization 函数,以确保在原始状态下工作。
Laravel 在基本 TestCase 类中使用 Once::flush(); 方法为您处理了这一细节。
感谢 Nuno Maduro,他在 #49744 请求中实现了此功能!
https://github.com/nunomaduro
https://github.com/laravel/framework/pull/49744
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号