Forum und email

Cambiamenti non compatibili

Anche se la maggior parte del codice PHP 4 esistente dovrebbe funzionare senza modifiche, occorre fare attenzione ai seguenti cambiamenti incompatibili col codice precedente:

  • Ci sono alcune nuove parole chiave riservate.
  • strrpos() e strripos() ora utilizzano l'intera stringa come argomento di ricerca.
  • 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 non è più impostata implicitamente sotto Apache2 SAPI diversamente che in PHP 4, dove è impostato allo stesso valore della variabile server SCRIPT_FILENAME quando non è riempito da Apache. Questa modifica è stata fatta per adeguarsi alle » specifiche CGI. Consultare il » bug #23610 per ulteriori informazioni, e vedere anche la descrizione di $_SERVER['PATH_TRANSLATED'] nel manuale. Questo problema interessa anche le versioni di PHP >= 4.3.2.
  • La costante T_ML_COMMENT non è più definita dall'estensione Tokenizer. Se error_reporting è impostata a E_ALL, PHP genera un avviso. Anche se la costante T_ML_COMMENT non è mai stata utilizzata, era definita in PHP 4. Sia in PHP 4 che in PHP 5 // e /* */ sono risolte come la costante T_COMMENT. Comunque i commenti in stile PHPDoc /** */, che a partire da PHP 5 sono analizzate da PHP, sono riconosciute come T_DOC_COMMENT.
  • $_SERVER dovrebbe essere popolata con argc e argv se variables_order include "S". Se si è configurato il sistema in modo da non creare $_SERVER, ovviamente questa non dovrebbe comparire. La modifica è stata quella di rendere argc e argv disponibile nella versione CLI a prescindere dall'impostazione di variables_order. Di conseguenza, la versione CLI ora popolerà sempre le variabili globali $argc e $argv.
  • Un oggetto senza proprietà non è più considerato "vuoto".
  • 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 contratio il comportamento è quello vecchio.
  • get_class(), get_parent_class() e 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 emette un errore fatale poiché le funzioni erano già dichiarate, mentre PHP 4 non si lamenta di questo. 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.
  • include_once() e require_once() in Windows per prima cosa normalizzano il percorso del file incluso in modo tale che includere A.php e a.php provochi una sola inclusione del file.

Example#1 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)
?>

Example#2 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
}
?>

Example#3 In alcuni casi le classi devono essere dichiarate prima dell'utilizzo

<?php

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


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

interface 
c{
}
class 
implements {


?>