E_STRICT – 5 errori comuni
Quando sviluppiamo un'applicazione PHP è molto importante configurare correttamente l'error_reporting per analizzare gli errori messaggi della nostra applicazione. Dalla versione 5 si è incluso un nuovo livello denominato E_STRICT. Secondo la definizione di php.net:
Enabling E_NOTICE during development has some benefits. For debugging purposes: NOTICE messages will warn you about possible bugs in your code. For example, use of unassigned values is warned. It is extremely useful to find typos and to save time for debugging. NOTICE messages will warn you about bad style. For example, $arr[item] is better to be written as $arr['item'] since PHP tries to treat "item" as constant. If it is not a constant, PHP assumes it is a string index for the array.
Con l'inclusione di E_STRICT nel E_ALL in PHP 5.4 no avremo scuse per non guardare questi messaggi.
PERCHÉ UTILIZZARE E_STRICT?
E_STRICT ci permette sviluppare codice più pulito e assicura una maggiore interoperabilità e compatibilità con versioni successive di PHP.
I 5 ERRORI PIÙ COMUNI USANDO E_STRICT
Di recente ho attivato l'E_STRICT in una web per aggiornare il codice e questi sono i 5 errori più frequenti con cui mi sono trovato faccia a faccia:
1. Funzioni obsolete
PHP ci indica se una funziona è deprecata. Ecco qui la lista delle obsolete per la versione 5.3: http://php.net/manual/en/migration53.deprecated.php
Errore:
PHP Deprecated: Function xxx() is deprecated
2. Static
Molte volte dimentichiamo di porre la keyword "static" nella definizione di una funzione che poi utilizziamo con class::method
Errore:
Non-static method XXX should not be called statically, assuming $this from incompatible context
3. Overloading
In PHP non esiste l'overloading, lo possiamo solo "simulare" con __call pero come tutti i metodi magici è abbastanza costoso. In altre parole non possiamo dichiarare due funzioni con lo stesso nome che si differenziano solo per la firma (parametri). Dunque nel caso dell'overriding (sovrascrittura di un metodo di una classe padre che abbiamo ereditato) dobbiamo utilizzare gli stessi parametri o, al massimo, aggiungerne altri.
Errore:
Declaration of XXX should be compatible with that of YYY
4. Passare una variabile a una funzione che accetta un parametro per referenzia
Non è possibile non passare una variabile a una funzione che accetta un parametro per referenzia. Concretamente non possiamo fare questo:
array_pop(explode('-', 'hello-world'));
Dobbiamo salvare il risultato dell'explode in una variabile e successivamente passarla all'array_pop:
$hola = explode('-', 'hello-world');
array_pop($var);
Ecco alcune funzioni che accettano parametri per referenzia: array_shift, array_unshift, array_pop, array_push, current, end...
Errore:
Only variables should be passed by reference
5. Creare un oggetto generico
A volte per passare dati via json o per comodità creiamo un oggetto generico senza inizializzarlo. Per esempio:
$obj->propierty = true;
In questo caso dobbiamo inizializzare l'oggetto in questo modo:
$obj = new stdClass();
$obj->propierty = true;
Errore:
Creating default object from empty value
CONCLUSIONI
L'uso di E_STRICT ci permetterà di sviluppare applicazioni compatibili con il futuro e ci aiuta a apprendere dettagli del PHP che non conoscevamo.