Context::set

(PHP 8.6+, True Async 1.0)

public Context::set(string|object $key, mixed $value, bool $replace = false): Context

Устанавливает значение в текущем контексте по указанному ключу. По умолчанию, если ключ уже существует, значение не перезаписывается. Для принудительной перезаписи используйте параметр replace = true.

Метод возвращает объект Context, что позволяет использовать цепочки вызовов (chaining).

Параметры

key
Ключ для установки значения. Может быть строкой или объектом. Объектные ключи полезны для избежания конфликтов имён между библиотеками.
value
Значение для сохранения. Может быть любого типа.
replace
Если false (по умолчанию) — не перезаписывать существующее значение. Если true — перезаписать значение, даже если ключ уже существует.

Возвращаемое значение

Объект Context для цепочки вызовов.

Примеры

Пример #1 Установка значений со строковыми ключами

<?php

use function Async\current_context;

// Цепочка вызовов
current_context()
    ->set('request_id', 'req-001')
    ->set('user_id', 42)
    ->set('locale', 'ru_RU');

echo current_context()->find('request_id') . "\n"; // "req-001"
echo current_context()->find('user_id') . "\n";    // 42

Пример #2 Поведение без перезаписи

<?php

use function Async\current_context;

current_context()->set('mode', 'production');

// Повторная установка без replace — значение НЕ изменится
current_context()->set('mode', 'debug');
echo current_context()->find('mode') . "\n"; // "production"

// С replace = true — значение перезаписывается
current_context()->set('mode', 'debug', replace: true);
echo current_context()->find('mode') . "\n"; // "debug"

Пример #3 Объектные ключи для изоляции библиотек

<?php

use function Async\current_context;
use function Async\spawn;

// Каждая библиотека использует свой объект-ключ
class LoggerContext {
    public static object $key;
}
LoggerContext::$key = new stdClass();

class CacheContext {
    public static object $key;
}
CacheContext::$key = new stdClass();

current_context()
    ->set(LoggerContext::$key, new FileLogger('/var/log/app.log'))
    ->set(CacheContext::$key, new RedisCache('localhost:6379'));

spawn(function() {
    $logger = current_context()->find(LoggerContext::$key);
    $cache = current_context()->find(CacheContext::$key);

    $logger->info('Кеш инициализирован');
});

Пример #4 Передача контекста в дочерние корутины

<?php

use function Async\current_context;
use function Async\spawn;

// Родительский контекст
current_context()
    ->set('trace_id', bin2hex(random_bytes(8)))
    ->set('service', 'api-gateway');

// Дочерние корутины наследуют значения через find()
spawn(function() {
    $traceId = current_context()->find('trace_id');
    echo "Обработка запроса: {$traceId}\n";

    // Дочерняя корутина добавляет своё значение
    current_context()->set('handler', 'user_controller');
});

См. также