Context::set
(PHP 8.6+, True Async 1.0)
public Context::set(string|object $key, mixed $value, bool $replace = false): Context
Définit une valeur dans le contexte courant avec la clé spécifiée. Par défaut, si la clé
existe déjà, la valeur n’est pas écrasée. Pour forcer l’écrasement, utilisez
le paramètre replace = true.
La méthode retourne l’objet Context, permettant le chaînage de méthodes.
Paramètres
- key
- La clé pour laquelle définir la valeur. Peut être une chaîne de caractères ou un objet. Les clés objet sont utiles pour éviter les conflits de noms entre bibliothèques.
- value
- La valeur à stocker. Peut être de n’importe quel type.
- replace
- Si
false(par défaut) — ne pas écraser une valeur existante. Sitrue— écraser la valeur même si la clé existe déjà.
Valeur de retour
L’objet Context pour le chaînage de méthodes.
Exemples
Exemple #1 Définition de valeurs avec des clés de type chaîne
<?php
use function Async\current_context;
// Chaînage de méthodes
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
Exemple #2 Comportement sans écrasement
<?php
use function Async\current_context;
current_context()->set('mode', 'production');
// Définition à nouveau sans replace — la valeur NE change PAS
current_context()->set('mode', 'debug');
echo current_context()->find('mode') . "\n"; // "production"
// Avec replace = true — la valeur est écrasée
current_context()->set('mode', 'debug', replace: true);
echo current_context()->find('mode') . "\n"; // "debug"
Exemple #3 Clés objet pour l’isolation des bibliothèques
<?php
use function Async\current_context;
use function Async\spawn;
// Chaque bibliothèque utilise sa propre clé objet
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('Cache initialisé');
});
Exemple #4 Transmission du contexte aux coroutines enfants
<?php
use function Async\current_context;
use function Async\spawn;
// Contexte parent
current_context()
->set('trace_id', bin2hex(random_bytes(8)))
->set('service', 'api-gateway');
// Les coroutines enfants héritent des valeurs via find()
spawn(function() {
$traceId = current_context()->find('trace_id');
echo "Traitement de la requête : {$traceId}\n";
// La coroutine enfant ajoute sa propre valeur
current_context()->set('handler', 'user_controller');
});
Voir aussi
- Context::unset — Supprimer une valeur par clé
- Context::find — Rechercher une valeur par clé
- Context::get — Obtenir une valeur (lève une exception)
- current_context() — Obtenir le contexte du Scope courant