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.

Andrea Vigato

Author Andrea Vigato

freelance | creazione siti web | consulenza aziendale

More posts by Andrea Vigato