Schimbări incompatibile în sens invers

Cu toate că majoritatea codului-sursă existent în PHP 4 ar trebui să funcționeze fără schimbări, totuși ar trebui să atrageți atenția la următoarele schimbări incompatibile în sens invers:

  • Sunt unele noi cuvinte-cheie rezervate.
  • strrpos() și strripos() acum utilizează întregul string în calitate de 'ac'.
  • Utilizarea nelegală a deplasamentelor în string-uri cauzează E_ERROR în loc de E_WARNING. Un exemplu de utilizare nelegală ar fi: $str = 'abc'; unset($str[0]);.
  • array_merge() a fost schimbată pentru ca să accepte numai tablouri. Dacă îi este transmisă o variabilă care nu este tablou, un E_WARNING va fi aruncat pentru fiecare astfel de parametru. Fiți atent, deoarece codul dumneavoastră poate să înceapă să emită E_WARNING din senin.
  • Variabila de server PATH_TRANSLATED nu mai este stabilită implicit sub Apache2 SAPI în contrast cu situația în PHP 4, unde ea este stabilită la aceeași valoare ca și variabila de server SCRIPT_FILENAME, atunci când nu este populată de Apache. Această schimbare a fost făcută pentru a ne conforma cu » specificația CGI/1.1. Vă rugăm să vă referiți la » bug #23610 pentru informații suplimentare și vedeți de asemenea descrierea $_SERVER['PATH_TRANSLATED'] în manual. Această problemă de asemenea afectează versiunile PHP >= 4.3.2.
  • Constanta T_ML_COMMENT nu mai este definită de către extensia Tokenizer. Dacă error_reporting este stabilită la E_ALL, PHP va genera o notificare. Cu toate că T_ML_COMMENT niciodată nu a fost utilizată, ea a fost definită în PHP 4. În ambele PHP 4 și PHP 5 // și /* */ sunt soluționate ca constante T_COMMENT. Însă comentariile în stil PHPDoc /** */, care începând cu PHP 5 sunt înțelese de PHP, sunt recunoscute ca T_DOC_COMMENT.
  • $_SERVER ar trebui să fie populată cu argc și argv dacă variables_order include "S". Dacă ați configurat sistemul dumneavoastră în mod specific să nu creeze $_SERVER, atunci desigur ea nu va fi. Schimbarea a fost de a face argc și argv disponibile în versiunea CLI indiferent de setarea variables_order. Deci versiunea CLI acum întotdeauna va popula variabilele globale $argc și $argv.
  • Un obiect fără proprietăți nu mai este considerat "vid".
  • În unele cazuri clasele trebuiesc declarate înainte de a fi utilizate. Aceasta se întâmplă numai dacă unele facilități noi ale PHP 5 (cum ar fi interfețele) sunt utilizate. În caz contrar, comportamentul este pe vechi.
  • get_class(), get_parent_class() și get_class_methods() acum întorc numele claselor/metodelor așa cum ele au fost declarate (respectându-se literele majuscule/minuscule), ceea ce poate duce la probleme cu script-urile mai vechi care se bazează pe comportamentul vechi (numele claselor/metodelor întotdeauna erau întoarse cu litere minuscule). O soluție posibilă este de a căuta aceste funcții în toate script-urile și de a le aplica strtolower(). Această diferențiere a literelor majuscule/minuscule de asemenea se aplică la constantele predefinite magice __CLASS__, __METHOD__ și __FUNCTION__. Valorile sunt întoarse exact cum sunt declarate (respectându-se literele majuscule/minuscule).
  • ip2long() acum întoarce FALSE când o adresă IP nevalidă îi este transmisă ca argument și nu -1 ca înainte.
  • Dacă există funcții definite într-un fișier inclus, ele pot fi utilizate în fișierul de bază indiferent dacă se află înainte de return sau după. Dacă fișierul este inclus de două ori, PHP 5 va emite o eroare fatală deoarece funcțiile au fost declarate deja, în timp ce PHP 4 nu se plânge de acest fapt. Este recomandat de a utiliza include_once în loc de a verifica dacă fișierul a fost inclus deja și de a ieși în acest caz din fișierul inclus.
  • include_once și require_once întâi normalizează calea fișierului inclus în Windows astfel încât includerea A.php și a.php va include fișierul numai o singură dată.
  • Transmiterea unui masiv prin valoare unei funcții nu mai resetează indicatorul intern al tabloului pentru accesele la tablou prin intermediul acestei funcții. Cu alte cuvinte, în PHP 4 când transmiteați un tablou unei funcții, indicatorul intern al tabloului era resetat, în timp ce în PHP 5, când transmiteți un tablou unei funcții, indicatorul tabloului în interiorul funcției rîmâne acolo unde era la momentul când tabloul a fost transmis funcției.

Example #1 strrpos() și strripos() acum utilizează întregul string în calitate de 'ac'

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

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

Example #2 Un obiect fără proprietăți nu mai este considerat "vid"

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

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

if ($t) {
    
// Va fi executat
}
?>

Example #3 În unele cazuri clasele trebuie declarate înainte de a fi utilizate

<?php

// funcționează fără erori:
$a = new a();
class 
{
}


// aruncă o eroare:
$a = new b();

interface 
c{
}
class 
implements {
}

?>