Perché è scoraggiato creare variabili al volo? PHP ti dà un errore di notifica

2

Voi ragazzi avete familiarità con quegli fastidiosi errori di avviso di PHP? Sai, quelli che appariranno quando fai qualcosa di simile:

if($some_variable == 45)

Ma se $ some_variable non fosse già stato creato, PHP sarà come "Hey! Idiot! Questa variabile non è stata ancora definita!" e genera un errore di notifica sullo schermo. Tuttavia, puoi semplicemente disattivare gli errori di notifica di PHP usando error_reporting (0) e l'applicazione funziona perfettamente. Qual e il punto? A chi importa se una variabile non è stata ancora creata? Perché non puoi crearlo al volo all'interno dell'istruzione if? Mi sembra che questo sia il modo facile e senza trucchi per farlo, ma a quanto pare PHP scoraggia questa pratica. Perché?

Quello che mi trovo a dover fare un sacco di volte è qualcosa del genere:

if(isset($some_variable) && $some_variable == 45)

Se $ some_variable non è impostato, l'istruzione if fallisce automaticamente, quindi la seconda condizione dell'istruzione if non viene mai verificata, quindi l'errore di notifica non si verifica mai. Funziona alla grande, ma sento che non dovrebbe essere necessario. Alcune delle applicazioni su cui sto lavorando sono enormi e temo che le condizioni aggiuntive aggiuntive possano rallentare il mio povero vecchio server se ce ne sono dozzine di istanze, in combinazione con migliaia di utenti. So che questa è solo una singola affermazione in più che sarebbe O (1), che non è un sacco di risorse, ma è ancora qualcosa di cui mi preoccupo. Non dovrei preoccuparmi di O (1) anche se ipoteticamente dovessi avere migliaia di utenti? Mi sto preoccupando troppo di essere efficiente?

So che gli errori di avviso di PHP possono essere facilmente disattivati utilizzando error_reporting (0). Non sono sicuro che determinati tipi di errori possano essere attivati / disattivati come desiderato, poiché non ho eseguito ricerche approfondite su error_reporting ().

La mia domanda è: qual è il punto? Perché è scoraggiato creare variabili al volo? Mi sento come se creare variabili al volo fosse un po 'più pigro, ma è più facile programmarlo 10000000x e dovrebbe essere il modo migliore per farlo.

Questo dovrebbe essere sia una questione filosofica che una domanda tecnica.

    
posta skcin7 01.02.2012 - 20:11
fonte

5 risposte

4

Anche se a volte penso che sarebbe bello essere in grado di creare variabili al volo senza generare quelle fastidiose "notifiche", spesso vedo i vantaggi di non essere in grado di farlo.

Penso che il maggiore vantaggio nel dichiarare esplicitamente le variabili o nel controllare che le variabili siano impostate è la leggibilità del codice. Il isset nell'esempio indica alla persona che legge il codice che $some_variable potrebbe non essere impostato. Anche se questo non fa risparmiare molto tempo (poiché vedranno che non è impostato quando leggono la nota), fornisce al lettore più informazioni, il che è sempre utile.

    
risposta data 01.02.2012 - 20:18
fonte
20

Promuove la codifica pulita. Se ti prendi l'abitudine di scrivere le tue app per essere prive di avvisi, allora puoi lasciare gli avvisi e, quando si verificano, ti diranno effettivamente qualcosa di significativo. Ad esempio, errori di ortografia sottili come i seguenti possono essere incredibilmente difficili da rintracciare se stai ignorando gli avvisi:

if ($some_variabel == 45) { ... }

Tuttavia, se lo fai e lascia gli avvisi su:

$some_variable = 0;
...
if ($some_variabel == 45) { ... }

Quindi il bug diventa immediatamente evidente.

    
risposta data 01.02.2012 - 20:20
fonte
3

Non dovresti codificare in modo tale da non sapere se una variabile è impostata

In questo modo il tuo codice viene posto in uno stato ambiguo. Il risultato finale di questo è tipicamente buggato, difficile da mantenere codice speghetti.

In PHP, i modi principali in cui si verifica questa situazione è se uno sta avendo PHP che crea automaticamente variabili globali dalle variabili GET / POST (register_globals), o che si sta facendo troppo nello scope globale piuttosto che all'interno di funzioni e metodi. Il primo è una cattiva idea per una serie di motivi di sicurezza, e il secondo, per applicazioni tutt'altro che banali, significa che il codice probabilmente non è strutturato bene.

Per aggirare questo problema,

  • non utilizzare register_globals,
  • inizializza in modo specifico ogni globale,
  • non fare molto nello scope globale,
  • non usare 'include ()' come sostitutivo per le giuste chiamate di funzioni e metodi.
risposta data 01.02.2012 - 21:19
fonte
2

Come BoltClock e JackManey hanno detto nei primi commenti, è davvero importante dichiarare tutte le variabili anche se qualcosa sembra funzionare. Un giorno, ti imbatterai in un problema in cui hai utilizzato due volte una variabile che avresti dovuto NON inizializzare e poi fallirà.

Perderai quindi 2-3 ore di traccia e debug cercando di scoprire perché stai assumendo questo comportamento funky e poi realizzi, d'ora in poi, inizializzerò sempre le mie variabili d'ora in poi. Mi impedirà di ottenere quell'unico errore funky.

E se entri in un'altra lingua probabilmente lo farai comunque. Quindi prenditi il tempo necessario per inizializzare le tue variabili, ti farà risparmiare un sacco di problemi in seguito.

    
risposta data 01.02.2012 - 20:19
fonte
1

Gli avvisi non sono errori. Sono messaggi di debug. E PHP consente di utilizzare le variabili senza inizializzazione. È not un linguaggio compilato e sostituisce correttamente le variabili assenti per NULL. Ti dà solo un ulteriore aiuto per il debug. Spesso è nel caso, ma spesso utile.

Le persone eliminano le notifiche con isset o @ e error_reporting quando diventa troppo travolgente. E hai davvero bisogno di distinguere tra comunicazioni utili e inutili. Non ha senso tenerli ovunque, e allo stesso modo non ha senso sopprimerli ovunque. (Anche i programmatori PHP esperti sono sopraffatti da questa differenziazione.)

    
risposta data 01.02.2012 - 20:26
fonte

Leggi altre domande sui tag