Forum und email

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 
{
}


//vyhodi chybu:
$a = new b();

interface 
c{
}
class 
implements {


?>