Recentemente mi sono trovato nella situazione di riscrivere del vecchio codice da PHP 4 a PHP 7 per un cliente. PHP 7 ha introdotto molte novità e ha rilanciato questo linguaggio di programmazione, molto usato nel web. Spesso ci si può trovare con codice non standard e le problematiche possono essere tante.
Il mio problema erano gli avvisi (E_DEPRECATED) legati ai costruttori di PHP4, non più supportati da PHP7. Vediamo cosa si può fare.
In PHP 4 i costruttori usavano lo stesso nome della classe:
<?php class Foo { function Foo() { // codice } } ?>
Questo è un problema perchè ci impone di cambiare tutti i nomi dei costruttori quando viene cambiato il nome della classe, e cambiare anche i nomi negli extends. PHP 5 ha poi introdotto il costruttore generico __construct per risolvere questo problema.
PHP 7 mostrerà un avviso di DEPRECATED quando una classe utilizza costruttori basati su PHP 4 (anche se non vengono usati).
PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; SubClass has a deprecated constructor in /path/to/file.php on line XX
Soluzione con Rinomina
Questa soluzione utilizza il semplice rinomina per far funzionare il codice di PHP 4, ma conserverà il log DEPRECATED di PHP 7 perchè non utilizza un costruttore generico.
<?php class OldClass { public function OldClass() { echo "costruttore OldClass"; } } ?>
Se si vuole togliere il problema del codice deprecato (cosa che suggerisco sempre), si deve intervenire direttamente sul costruttore per utilizzare lo stile di PHP7.
<?php class OldClass { public function __construct() { echo "costruttore OldClass"; } } ?>
In questo caso però, tutte le chiamate al costruttore potranno dare errore perchè non trovano più il nome del costruttore.
Soluzione con Costruttore PHP5-style
Per ovviare a questo basterà mantenere entrambi i metodi di costruttori, uno per PHP4 e uno per PHP7, senza che ci sia alcun conflitto in tutto il resto del codice:
class OldClass { public function __construct() { echo "costruttore OldClass"; } public function OldClass() { self::__construct(); } } ?>
In questo caso chiamata che arriva a OldClass utilizza il codice self::__construct() che richiama il costruttore con stile di PHP 5 (e quindi supportato da PHP7). Non ci saranno errori di codice deprecato e si potrà mantenere aggiornato tutto il resto del codice.
Articolo scritto da Christian Weiske (link all’originale), tradotto da Andrea Vigato.