E_NOTICE: Quanto è utile VERAMENTE fissare tutti?

Prima di tutto so che questa domanda è andata in giro più di una volta qui:

  • Perché dovrei correggere gli errori E_NOTICE?
  • Perché dovrei correggere gli errori E_NOTICE? Pro e contro

Ma più sistemo tutti gli E_NOTICE (come dicono le persone dovresti) più mi accorgo che:

  • Sono micro-ottimizzante
  • In realtà sto facendo più codice e rendendo il mio codice più difficile da mantenere e più lento

Prendi un esempio:

Supponiamo che tu usi il driver MongoDB PHP e che tu abbia un object MongoDate in una class var chiamata ts all'interno di una class che rappresenta una singola row in una raccolta nel tuo database. Ora $obj->ts->sec questa var come: $obj->ts->sec ma PHP genera un adattamento (E_NOTICE) perché ts in questo caso non è definito come un object in sé perché questa particolare row non ha un field ts . Quindi pensi che questo sia OK, questo è il comportmento desiderato, se non è impostato return null e mi prenderò cura di me stesso al di fuori degli stessi meccanismi robotici degli interpreti (poiché lo avvolgi in una function date() che restituisce solo 1970 se il var è null o un none-object ).

Ma ora per risolvere il fatto che E_NOTICE come un altro sviluppatore mi vuole davvero, visto che avere QUALSIASI E_NOTICE è terribile e rende il codice più lento a non farlo in base agli errori. Quindi getTs una nuova function nella class $obj chiamata getTs e gli do 3 righe, letteralmente per non fare altro che controllare se la ts var è un object MongoDate e restituirlo se è …

PERCHÉ? PHP non riesce a farlo perfettamente bene con il suo interpnetworking molto più veloce rispetto a whererlo fare durante il runtime dell'applicazione stessa? Intendo each where devo aggiungere inutili bumpth al mio codice, praticamente funzioni vuote per rilevare variables che in realtà gestisco solo con la capacità di PHP di restituire null o controllare la loro instanceof quando ho veramente bisogno di (quando è vitale per il operazione e comportmento della suddetta function) e non farmi iniziare su isset() s Ho aggiunto circa 300 righe di isset() s, sta sfuggendo di mano. Ovviamente devo fare in getTs funzioni di getTs non si possano fare:

 class obj{ public $ts = new MongoDate(); } 

Dovrei o memorizzare la ts all'interno del __constructor (che non sono troppo contento di entrambi, sto usando un sacco di magie così com'è) o usare una function per rilevare se è impostata (cosa che faccio ora).

Voglio dire, capisco perché dovrei risolvere:

  • Vde indefinite
  • Assegnazione delle properties; di unset vars (vars null )
  • errori costanti ecc

Ma se hai testato il tuo codice e sai che è sicuro e functionrà nel modo in cui desideri, qual è il problema nel correggere tutti gli undefined index o gli errori senza none-object ? Non sta aggiungendo un isset() funzioni isset() 2 linee al codice in realtà micro-ottimizzazione?

Ho notato dopo aver reso la metà del mio sito compatibile con E_NOTICE che in realtà utilizza più CPU, memory e tempo ora … quindi qual è il punto di trattare each errore E_NOTICE e non solo quelli che sono errori?

Grazie per i tuoi pensieri,

Se sia necessario o less risolverli è certamente discutibile, e dipenderà solo dal rendimento della tua situazione; ad esempio, è più importnte se il codice avrà una durata di vita più lunga, più sviluppatori, ecc.

In generale, supponendo che le tue funzioni vengano utilizzate (e mal utilizzate) da qualcun altro è la migliore pratica, quindi dovresti fare i controlli isset /! Empty / is_object per tener conto di ciò. Spesso, il tuo codice troverà la sua strada in usi e situazioni che non hai mai inteso.

Per quanto riguarda le performance, each volta che viene generato un qualsiasi tipo di errore, incluso E_NOTICE, l'interpnetworking fa girare il gestore degli errori, crea una traccia dello stack e formatta l'errore. Il punto è che, indipendentemente dal fatto che tu li abbia o less segnalati, gli errori rallentano sempre l'esecuzione; quindi, 2-3 chiamate di function per evitare un E_NOTICE miglioreranno ancora le tue performance .

Modifica: alternative per l'esempio precedente

Non creerei necessariamente oggetti extra per evitare gli errori; puoi con garbo evitarli senza. Ecco un paio di opzioni:

1) Funzione che gestisce ts mancanti:

 SpecialClass class { funciton getTs () { return !empty($this->ts) ? $ts->sec : false; } } 

2) Gestire le ts mancanti nel model / procedura:

 if (!empty($obj->ts->sec)) { //do something } 

Mi piace particolarmente empty() perché puoi usarlo per sostituire (isset($var) && ($var or 0 != $var //etc)) , salvando più chiamate / confronti e vuoto non getta mai notifiche per la variabile target o attributo. Genererà un errore se lo si chiama su una properties; / membro di una variabile inesistente.

Sicuramente ottieni performance migliori usando isset() . Ho fatto alcuni benchmark, non molto tempo fa, e gli errori nascosti si sono rivelati circa 10 volte più lenti.

http://garrettbluma.com/2011/11/14/php-isset-performance/

Detto questo, le performance di solito non sono un fattore critico in PHP. Quello che mi fa impazzire personalmente sono errori silenziosi .

Quando l'interpnetworking sceglie di non contrassegnare qualcosa come un errore (che potrebbe portre all'instabilità) è un grosso problema. PHP in particolare ha una tendenza a

  • avvertire su cose che dovrebbero essere errate (ad es. mancata connessione al database) e
  • emettere avvisi su cose che dovrebbero avvisare (ad es. tentare di accedere ad un membro di un object nullo).

Forse sono solo eccessivamente supponente su questo genere di cose ma sono stato morso prima da questi errori silenziosi. Raccommand di includere sempre E_NOTICE nella segnalazione degli errori.