PHP 5 Hosting Linux : consigli ed accorgimenti per la compatibilita' verso PHP 4

La nuova versione di PHP e' stata notevolmente potenziata grazie al motore Zend Engine 2, oltre a numerose nuove funzionalita' implementate.

Gli sviluppatori della piattaforma hanno tenuto in grande considerazione la necessita' di compatibilita' verso le applicazioni e gli script creati per la versione precedente, ma alcune differenze nel motore rendono necessarie alcune modifiche al vecchio codice ed alcuni accorgimenti nella scrittura del nuovo. Direttamente dalle pagine di supporto di php.net, riportiamo i punti salienti: tutti i links si aprono in nuova finestra.

Cambiamenti non compatibili (fonte completa, php.net
)

  • Ci sono alcune nuove parole chiave riservate.
  • strrpos() e strripos() ora utilizzano l'intera stringa come argomento di ricerca.

<?php
var_dump
(strrpos('ABCDEF','DEF')); 
//int(3)

var_dump(strrpos('ABCDEF','DAF')); 
//bool(false)
?>

  • L'uso illegale degli offset delle stringhe causa E_ERROR invece di E_WARNING. Un esempio di utilizzo illegale è: $str = 'abc'; unset($str[0]);.
  • array_merge() è stata cambiata per accettare solo array. Se viene passata una variabile che non è un array, un E_WARNING viene lanciato per ogni parametro. Prestare attenzione, poiché il codice può cominciare ad emettere E_WARNING improvvisamente.
  • La variabile server PATH_TRANSLATED e' stata modificata: vedere anche la descrizione di $_SERVER['PATH_TRANSLATED'] nel manuale.
  • Un oggetto senza proprietà non è più considerato "vuoto".

<?php
class test 
{ }
$t = new test
();

var_dump(empty($t)); 
// echo bool(false)

if ($t
) {
    
// Viene eseguito
}
?>

  • In alcuni casi le classi devono essere dichiarate prima dell'utilizzo. Questo succede solo se è usata qualcuna delle nuove caratteristiche di PHP 5 (come le interfacce). In caso contrario il comportamento è quello vecchio.

<?php

//funziona senza errori:
$a = new a
();
class 
{
}


//emette un errore:
$a = new b
();

interface 
c
{
}
class 
implements 
{


?>

 

  • get_class()get_parent_class()get_class_methods() ora restituiscono il nome di classi/metodi come sono dichiarati (case-sensitive) il che può portare a problemi in vecchi script che si basano sul comportamento precedente (il nome di classe/metodo era sempre restituito a caratteri minuscoli). Una soluzione possibile è quella di cercare queste funzioni negli script ed utilizzare strtolower(). Questa modifica alla sensibilità di maiuscole/minuscole si applica anche alle costanti magiche predefinite __CLASS__, __METHOD__, e __FUNCTION__. I valori sono restituiti esattamente come dichiarati (case-sensitive).
  • ip2long() ora restituisce FALSE quando un IP address non valido è passata come argomento alla funzione, e non più -1.
  • Se esistono funzioni definite in un file incluso, queste possono essere utilizzate nel file principale indipendentemente dal fatto che siano prima di return() o dopo. Se il file è incluso due volte, PHP 5 genera un fatal error poiché le funzioni erano già dichiarate. Si raccomanda di utilizzare include_once() invece di controllare se il file è stato già incluso e fare un return condizionato all'interno del file incluso. 

Inoltre:

-Non si puo' riassegnare $this : l'esempio che segue funziona su PHP4 (mostra "OK"), mentre produce un "fatal error" sotto PHP5:
 

<?
 
class
a
 
{
    var
$text
;
    function
a() { $this->text = 'OK'
; }
  }

  class
b
 
{
    var
$text = 'NOT OK'
;
    function
b() { $this = new a
(); }
  }
   
 
$myClass = new b
();
  echo
$myClass->text
;
?>

 

-Non sono piu' consentiti commenti al codice con questa sintassi

<?=//commento?>


-Constructors e reference, attenzione, il seguente esempio funziona sotto PHP4 mentre produce un avviso E_NOTICE su PHP5. In questo caso il problema si risolve rimuovendo &

<?
 
class MyClass { function MyClass() { echo('OK'
); } }
 
$myObj = null
;
 
$myObj &= new MyClass
();
?>

 

In PHP5 sono inoltre disponibili nuove funzioni , ad esempio in merito al trattamento array:

  • array_combine() - Crea un array utilizzando un array per le chiavi e un altro per i valori.
  • array_diff_uassoc() - Calcola la differenza tra array con la possibilità di controllare gli indici mediante una funzione di callback fornita dall'utente
  • array_udiff() - Calcola la differenza tra array utilizzando una funzione callback per la comparazione dei dati
  • array_udiff_assoc() - Calcola la differenza tra array con la possibilità di verificare gli indici. I valori sono comparati utilizzando una funzione di callback
  • array_udiff_uassoc() - Calcola la differenza tra array con la possibilità di verificare gli indici. I valori sono comparati utilizzando una funzione di callback. La verifica degli indici è fatta utilizzando una funzione di callback
  • array_walk_recursive() - Applica una funzione utente in modo ricorsivo ad ogni elemento di un array
  • array_uintersect_assoc() - Calcola l'intersezione di array con la possibilità di verificare gli indici. I valori sono comparati utilizzando una funzione di callback
  • array_uintersect_uassoc() - Calcola l'intersezione di array con la possibilità di verificare gli indici. Sia i valori che gli indici sono comparati utilizzando funzioni di callback
  • array_uintersect() - Calcola l'intersezione di array. I valori sono comparati utilizzando una funzione di callback

 

Se usate applicazioni di terze parti, cms, portali, forums, guestbook, ecc, assicuratevi che l'applicazione sia compatibile con PHP5 presso il supporto-casa madre dell'applicazione o script in questione.