Функция once
Функция once принимает замыкание в качестве аргумента и возвращает результат его выполнения. При повторном вызове функции с тем же замыканием возвращается кешированный результат, и замыкание не выполняется повторно. Это особенно полезно при работе с тяжёлыми вычислениями, запросами к базе данных или внешними API, результат которых должен быть получен только один раз.
Синтаксис
<?php
once($callback);
?>
Параметр callback - это замыкание, которое должно быть выполнено один раз. Функция возвращает результат выполнения замыкания.
Пример
Рассмотрим простой пример использования функции once:
<?php
use Illuminate\Support\Facades\Log;
$res1 = once(function () {
Log::info('Function executed');
return rand(1, 100);
});
$res2 = once(function () {
Log::info('Function executed');
return rand(1, 100);
});
echo $res1;
echo $res2;
?>
Результат выполнения кода:
"42"
"42"
Обратите внимание, что замыкание было выполнено только один раз, а во второй раз возвращён кешированный результат.
Пример
Функция once использует ключ для идентификации замыкания. Если ключи разные, замыкания будут выполнены отдельно:
<?php
$res1 = once(function () {
return rand(1, 10);
});
$res2 = once(function () {
return rand(1, 10);
});
echo $res1;
echo $res2;
?>
Результат выполнения кода:
"7"
"3"
В этом примере замыкания разные, поэтому функция once выполнила их оба и вернула разные результаты.
Пример
Функция once особенно полезна при работе с тяжелыми запросами к базе данных:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
public function index()
{
$users = once(function () {
return User::where('status', 'active')
->with('posts')
->get();
});
$count = $users->count();
return view('users.index', [
'users' => $users,
'count' => $count
]);
}
}
?>
В этом примере запрос к базе данных выполняется только один раз, даже если мы обращаемся к результату несколько раз.
Пример
Рассмотрим случай, когда функция вызывается с одним и тем же замыканием, но разными ключами:
<?php
$callback = function () {
return 'Hello, World!';
};
$res1 = once($callback);
$res2 = once($callback);
$res3 = once($callback);
echo $res1;
echo $res2;
echo $res3;
?>
Результат выполнения кода:
"Hello, World!"
"Hello, World!"
"Hello, World!"
Здесь замыкание выполняется только один раз, а все последующие вызовы возвращают закешированный результат.