Introduzione
Quando si parla di PHP, PSR e coding standard, spesso l’attenzione si concentra su classi, namespace, autoloading o formattazione del codice. Un aspetto però molto pratico, e spesso trascurato, è la gestione dei file di configurazione. In un progetto reale, infatti, la configurazione non è un dettaglio secondario: connessioni al database, chiavi API, parametri di debug, percorsi e opzioni di servizio devono essere gestiti in modo chiaro, coerente e sicuro.
In questo tutorial vedremo come strutturare i file di configurazione seguendo un approccio compatibile con gli standard PSR e con buone pratiche di sviluppo professionale. L’obiettivo non è solo “far funzionare” la configurazione, ma renderla leggibile, manutenibile e facile da testare.
Il sotto-argomento scelto è utile perché nei progetti PHP medi e grandi la configurazione tende a crescere rapidamente. Se non è organizzata bene, diventa presto fonte di bug, duplicazioni e dipendenze nascoste. Con un approccio ordinato, invece, possiamo separare i dati di configurazione dal codice applicativo e mantenere il progetto pulito.
Codice completo
Di seguito un esempio semplice ma realistico di struttura configurazione in PHP, con un file di configurazione dedicato e una classe che lo carica in modo coerente.
<?php
declare(strict_types=1);
namespace AppConfig;
final class Config
{
/**
* @var array<string, mixed>
*/
private array $settings;
/**
* @param array<string, mixed> $settings
*/
public function __construct(array $settings)
{
$this->settings = $settings;
}
/**
* Restituisce un valore di configurazione usando una chiave con notazione "dot".
*
* Esempio: database.host
*/
public function get(string $key, mixed $default = null): mixed
{
$segments = explode(´.´, $key);
$value = $this->settings;
foreach ($segments as $segment) {
if (!is_array($value) || !array_key_exists($segment, $value)) {
return $default;
}
$value = $value[$segment];
}
return $value;
}
}
<?php
declare(strict_types=1);
return [
´app´ => [
´name´ => ´Demo Shop´,
´env´ => ´production´,
´debug´ => false,
],
´database´ => [
´host´ => ´127.0.0.1´,
´port´ => 3306,
´name´ => ´demo_shop´,
´user´ => ´root´,
´password´ => ´secret´,
],
´mail´ => [
´from´ => ´[email protected]´,
´smtp_host´ => ´smtp.example.com´,
],
];
<?php
declare(strict_types=1);
use AppConfigConfig;
$configArray = require __DIR__ . ´/../config/app.php´;
$config = new Config($configArray);
echo $config->get(´app.name´, ´Applicazione sconosciuta´);
echo PHP_EOL;
echo $config->get(´database.host´, ´localhost´);
echo PHP_EOL;
echo $config->get(´mail.from´, ´[email protected]´);
echo PHP_EOL;
Spiegazione
Questo esempio mostra una strategia semplice: il file config/app.php restituisce un array associativo, mentre la classe Config si occupa di leggere i valori in modo ordinato. È una soluzione molto utile perché separa i dati dalla logica.
1. Perché usare un file che restituisce un array
Un file di configurazione che ritorna un array è facile da leggere e da versionare. Inoltre, può essere incluso con require e trasformato in una struttura centralizzata. Questo approccio è molto comune nei progetti PHP moderni perché evita di spargere variabili globali in tutto il codice.
Nel file di configurazione abbiamo sezioni logiche come app, database e mail. Questa organizzazione è utile perché mantiene i parametri raggruppati per dominio funzionale.
2. Perché una classe Config è una buona idea
La classe Config incapsula l’accesso ai dati. Invece di scrivere ovunque $config[´database´][´host´], possiamo usare una forma più espressiva come $config->get(´database.host´). Questo migliora la leggibilità e riduce gli errori di accesso a chiavi mancanti.
La notazione “dot” è pratica perché rende le chiavi più facili da leggere e da cercare. Inoltre, la classe può gestire un valore di default quando la chiave non esiste, evitando errori fatali o warning inutili.
3. Come si collega tutto agli standard PSR
Anche se non esiste un PSR dedicato esclusivamente alla configurazione, questo approccio si allinea bene con diversi standard PSR e con il coding style professionale:
- PSR-12: il codice è formattato in modo coerente, con nomi chiari, indentazione uniforme e dichiarazione
strict_types. - PSR-4: la classe
Configè collocata in un namespace coerente, ad esempioAppConfig, e può essere caricata automaticamente. - Principi di progettazione pulita: separazione delle responsabilità, riduzione degli effetti collaterali e facilità di test.
In altre parole, il valore non è solo tecnico ma anche architetturale: i file di configurazione diventano parte di una struttura ordinata e prevedibile.
4. Il ruolo di declare(strict_types=1)
L’istruzione declare(strict_types=1) aiuta a rendere il codice più affidabile. In una classe come Config, dove ci aspettiamo array e stringhe ben definite, il typing rigoroso riduce comportamenti ambigui e conversioni automatiche indesiderate.
5. Il valore di default
Il secondo parametro del metodo get() è un valore di fallback. È importante perché in un progetto reale non tutte le chiavi saranno sempre presenti. Ad esempio, in ambiente di sviluppo potremmo avere un parametro app.debug, mentre in produzione potrebbe essere disattivato o gestito diversamente.
Avere un default evita di interrompere il flusso dell’applicazione per una chiave non trovata, ma deve essere usato con attenzione: un default sbagliato può nascondere errori di configurazione.
Best practice
- Non inserire segreti nel repository: password, token e chiavi API non dovrebbero stare in chiaro nei file versionati. Meglio usare variabili d’ambiente o file locali esclusi dal controllo versione.
- Separare configurazione statica e dinamica: i parametri stabili possono stare in file PHP, mentre quelli sensibili o dipendenti dall’ambiente possono arrivare da
$_ENVo da un gestore dedicato. - Usare namespace e classi dedicate: evitare configurazioni globali sparse. Una classe come
AppConfigConfigè più facile da testare e mantenere. - Raggruppare le chiavi per dominio: ad esempio
database,mail,cache,app. Questo rende il file più leggibile. - Documentare le chiavi principali: nei team di lavoro è utile indicare il significato dei parametri più importanti, soprattutto se vengono letti in più punti dell’applicazione.
- Validare la configurazione all’avvio: se un parametro è obbligatorio, meglio verificare subito la sua presenza invece di scoprire l’errore in fase di runtime avanzata.
- Evita array troppo profondi: una struttura eccessivamente annidata diventa difficile da leggere. Due o tre livelli sono spesso sufficienti.
Riepilogo
Organizzare i file di configurazione in PHP in modo professionale significa andare oltre il semplice “mettere valori in un array”. Vuol dire costruire una struttura chiara, coerente e compatibile con gli standard moderni del linguaggio. L’esempio visto mostra un approccio pratico: un file PHP che restituisce un array, una classe dedicata per l’accesso ai dati e una gestione ordinata delle chiavi con notazione dot.
Questo metodo migliora la manutenzione del progetto, rende il codice più leggibile e facilita l’automazione dei test. Inoltre, si integra bene con PSR-12 e PSR-4, due pilastri fondamentali nello sviluppo PHP professionale.
Se vuoi scrivere applicazioni più robuste, la configurazione non deve essere improvvisata: trattala come una parte importante dell’architettura, non come un dettaglio secondario.
Approfondisci con risorse ufficiali
- PSR-12 – Extended Coding Style Guide: https://www.php-fig.org/psr/psr-12/
- PSR-4 – Autoloader Standard: https://www.php-fig.org/psr/psr-4/
- PHP-FIG – Documentazione ufficiale degli standard PSR: https://www.php-fig.org/
- Manuale PHP – Variabili d’ambiente e funzioni correlate: https://www.php.net/manual/it/
