Spätne Nekompatibilné Zmeny
I keď vačšina existujúceho PHP 4 kódu by mala fungovať bez zmien, mali by ste dať pozor na následujúce spätne nekompatibilné zmeny:
- strrpos() a strripos() teraz využívajú celý reťazec ako ihlu.
- Nelegálne použitie offsetov reťazca spôsobuje E_ERROR namiesto E_WARNING.
- array_merge() bola zmenená, aby prijímala iba polia. Ak sa pošle premenná, ktorá nie je pole, vyhodí sa E_WARNING pre každý taký parameter. Buďte opatrný, pretože váš kód môže začať emitovať E_WARNING z ničoho nič.
- Premenná servera PATH_TRANSLATED už viac nie je nastavená implicitne pod Apache2 SAPI ako kontrast k situácii v PHP 4, kde je nastavená na rovnakú hodnotu ako premenná servera SCRIPT_FILENAME, kde nie je obývaná Apache-om. Táto zmena bola urobená, aby vyhovovala » CGI špecifikácii. Prosím, pozrite si » bug #23610 pre viac informácii.
- Konštanta T_ML_CONSTANT už nie je definovaná rozšírením Tokenizer. Ak je error_reporting nastavený na E_ALL, PHP vygeneruje hlášku. I keď T_ML_CONSTANT sa nikdy vôbec nepožila, bola definovaná v PHP 4. V oboch PHP 4 a PHP 5 // a /* */ sa chápu ako konštanta T_COMMENT. Avšak PHPDoc štýlové komentáre /** */ , ktoré začínajú PHP 5 sú analyzované PHP, sa rozpoznávajú ako T_DOC_COMMENT.
- $_SERVER by mala byť obývaná s argc a argv ak variables_order zahŕňa "S". Ak ste špecificky konfigurovali váš system, aby nevytváral $_SERVER, potom samozrejme by tam nemala byť. Zmenou bolo vždy urobiť argc a argv dostupné v CLI verzii bez ohľadu na nastavenie variables_order. CLI verzia bude teraz vždy obývať globálne premenné $argc a $argv.
- Objekt so žiadnymi vlastnosťami sa už viac nepovažuje za "empty".
- V niektorých prípadoch triedy musia byť deklarované pred použitím. Stane sa tak iba ak sa použije niektorá z nových vlastností PHP 5. Inak je správanie staré.
- get_class() počínajúc PHP 5 vracia názov triedy ako bola deklarovaná, čo môže viesť k problémom v starších skriptoch, ktoré sa spoliehajú na predošlé správanie (názov triedy je lowercase). Možné riešenie je vyhľadať get_class() vo vašich skriptoch a použiť strtolower().
- ip2long() teraz vracia FALSE, keď sa pošle neplatná IP adresa ako argument funkcii a už nie -1.
Example#1 strrpos() a strripos() teraz používa celý reťazec ako ihlu
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Example#2 Objekt so žiadnými vlastnosťami sa už viac nepovažuje za "empty"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if (!$t) {
// Sa vykona
}
?>
Example#3 V niektorých prípadoch sa triedy pred použitím musia deklarovať
<?php
//funguje bez chyb:
$a = new a();
class a {
}
//vyhodi chybu:
$a = new b();
interface c{
}
class b implements c {
}
?>