Context::set

(PHP 8.6+, True Async 1.0)

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

Imposta un valore nel contesto corrente con la chiave specificata. Per impostazione predefinita, se la chiave esiste gia’, il valore non viene sovrascritto. Per forzare la sovrascrittura, usa il parametro replace = true.

Il metodo restituisce l’oggetto Context, consentendo il concatenamento dei metodi.

Parametri

key
La chiave per cui impostare il valore. Puo’ essere una stringa o un oggetto. Le chiavi oggetto sono utili per evitare conflitti di nome tra librerie.
value
Il valore da memorizzare. Puo’ essere di qualsiasi tipo.
replace
Se false (predefinito) — non sovrascrive un valore esistente. Se true — sovrascrive il valore anche se la chiave esiste gia’.

Valore di ritorno

L’oggetto Context per il concatenamento dei metodi.

Esempi

Esempio #1 Impostazione di valori con chiavi stringa

<?php

use function Async\current_context;

// Concatenamento dei metodi
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

Esempio #2 Comportamento senza sovrascrittura

<?php

use function Async\current_context;

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

// Impostazione di nuovo senza replace — il valore NON cambia
current_context()->set('mode', 'debug');
echo current_context()->find('mode') . "\n"; // "production"

// Con replace = true — il valore viene sovrascritto
current_context()->set('mode', 'debug', replace: true);
echo current_context()->find('mode') . "\n"; // "debug"

Esempio #3 Chiavi oggetto per l’isolamento delle librerie

<?php

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

// Ogni libreria usa la propria chiave oggetto
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 inizializzata');
});

Esempio #4 Passaggio del contesto alle coroutine figlie

<?php

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

// Contesto genitore
current_context()
    ->set('trace_id', bin2hex(random_bytes(8)))
    ->set('service', 'api-gateway');

// Le coroutine figlie ereditano i valori tramite find()
spawn(function() {
    $traceId = current_context()->find('trace_id');
    echo "Elaborazione richiesta: {$traceId}\n";

    // La coroutine figlia aggiunge il proprio valore
    current_context()->set('handler', 'user_controller');
});

Vedi anche