Regola
Evita le variabili dinamici
Variabile nomi nomi (variabili variabili) possono portare
a difficoltà da da mantenere codice e comportamento .
Il loro utilizzo è di solito il risultato di un errore di battitura.
Lingue supportate: PHPIntroduzione
La funzionalità delle "variabili variabili" di PHP consente di utilizzare il valore di una variabile come nome di un'altra variabile con il $$ sintassi. Quella che sembra una scorciatoia ingegnosa si trasforma in un incubo per il debug quando non è possibile determinare in modo statico quali variabili esistano o quale sia il loro contenuto. Il codice che utilizza $$userName L'uso di una proprietà di array o oggetto rende impossibile agli IDE fornire il completamento automatico, agli analizzatori statici individuare i bug e agli sviluppatori tracciare il flusso dei dati all'interno dell'applicazione.
Perché è importante
Manutenibilità del codice: le variabili variabili compromettono il funzionamento di tutti gli strumenti su cui fanno affidamento gli sviluppatori. Gli IDE non sono in grado di completare automaticamente i nomi delle variabili, individuarne gli utilizzi o eseguire il refactoring in modo sicuro. Gli strumenti di analisi statica non riescono a rilevare variabili non definite o discrepanze di tipo. Il debug richiede un’ispezione in fase di esecuzione, poiché non è possibile effettuare ricerche nel codice per individuare i punti in cui le variabili vengono impostate o lette.
Implicazioni in materia di sicurezza: Quando i nomi delle variabili provengono dall’input dell’utente, gli aggressori possono sovrascrivere variabili arbitrarie, comprese quelle critiche per la sicurezza. Un parametro di richiesta dannoso potrebbe prendere di mira $$_GET['var'] per sovrascrivere $isAdmin, $userId, oppure variabili di sessione. Ciò crea vulnerabilità legate all’iniezione di variabili che sono difficili da individuare e facili da sfruttare.
Impatto sulle prestazioni: le variabili variabili costringono PHP a eseguire ricerche in fase di esecuzione anziché la risoluzione dei simboli in fase di compilazione. L'interprete deve valutare dinamicamente il nome della variabile ad ogni accesso, impedendo così le ottimizzazioni che funzionano con le variabili normali. Gli array e gli oggetti offrono funzionalità simili con prestazioni migliori.
Esempi di codice
❌ Non conforme:
function processFormData($formType) {
$userForm = ['name' => '', 'email' => ''];
$adminForm = ['name' => '', 'email' => '', 'role' => ''];
$formName = $formType . 'Form';
$$formName = array_merge($$formName, $_POST);
if ($$formName['email']) {
sendEmail($$formName['email']);
}
return $$formName;
}
// What variable does this actually use?
processFormData('user');
Perché è sbagliato: Il codice crea $userForm oppure $adminForm in modo dinamico utilizzando $$formName, rendendo impossibile individuare quale variabile venga modificata. Se $formType poiché deriva dall'input dell'utente, gli aggressori potrebbero inserire nomi di variabili arbitrari per sovrascrivere variabili critiche.
✅ Conforme:
function processFormData(string $formType): array {
$forms = [
'user' => ['name' => '', 'email' => ''],
'admin' => ['name' => '', 'email' => '', 'role' => '']
];
if (!isset($forms[$formType])) {
throw new InvalidArgumentException('Invalid form type');
}
$form = array_merge($forms[$formType], $_POST);
if (!empty($form['email'])) {
sendEmail($form['email']);
}
return $form;
}
// Clear which data structure is being used
processFormData('user');
Perché è importante: il codice utilizza un array esplicito con chiavi note, rendendo chiaro il flusso dei dati e consentendo di sfruttare tutte le funzionalità dell'IDE. La convalida degli input previene gli attacchi di tipo "injection", mentre l'analisi statica permette di verificare la correttezza del codice.
Conclusione
Sostituisci le variabili variabili con array, oggetti o una struttura del codice più adeguata. Utilizza gli array quando hai bisogno di un accesso dinamico alle chiavi, ricorri agli oggetti per i dati strutturati con proprietà note e rifattorizza la logica duplicata in astrazioni appropriate. Le variabili variabili indicano quasi sempre un problema di progettazione che strutture dati adeguate risolverebbero in modo più chiaro.

