If any of your code relies on includes of URLS à la allow_url_fopen, be aware that a new directive (allow_url_include) has been added, and that it defaults to Off.
Schimbări incompatibile în sens invers
Cu toate că codul-sursă existent în PHP 5 trebuie să funcţioneze fără schimbări, ar trebui să atrageţi atenţia la următoarele schimbări incompatibile în sens invers:
- getrusage() întoarce NULL când îi sunt transmise argumente incompatibile începând cu PHP 5.2.1.
- ZipArchive::setCommentName() întoarce TRUE în caz de succes începând cu PHP 5.2.1.
- ZipArchive::setCommentIndex() întoarce TRUE în caz de succes începând cu PHP 5.2.1.
- SplFileObject::getFilename() întoarce denumirea fişierului, şi nu calea/relativă/spre/fişier, începând cu PHP 5.2.1.
- S-a modificat prioritatea variabilei de mediu PHPRC pe sistemele Win32. Variabila de mediu PHPRC acum are prioritate faţă de calea stocată în registrul Windows.
- CLI SAPI nu mai caută fişierele php.ini sau php-cli.ini în directorul curent. În PHP 5.1.x a fost introdusă o facilitate nedocumentată care făcea ca binarul CLI să caute în Directorul de Lucru Curent (DLC) un fişier de configurare PHP, ducând potenţial la un comportament imprevizibil atunci când era citit un fişier de configurare neaşteptat. Această funcţionalitate a fost eliminată în versiunea 5.2.0, şi PHP nu mai caută în DLC fişierele php.ini sau php-cli.ini. Accesaţi de asemenea secţiunea manualului referitoare la linia de comandă.
-
A fost adăugată o preîntâmpinare la efectuarea operaţiei modulus 0.
În versiunile anterioare ale PHP, efectuarea operaţiei "integer % 0" nu
emitea nici un mesaj de preîntâmpinare, întorcând, în loc, o valoare
neaşteptată FALSE. Începând cu PHP 5.2.0 această operaţie va emite un
E_WARNING, după cum e cazul şi în orice altă
situaţie când se efectuează împărţirea la zero.
<?php
print 10 % 0;
/* Warning: Division by zero in filename on line n */
?> -
A fost modificat __toString() pentru a fi apelat
oricând este aplicabil.
Metoda magică __toString() acum va fi apelată în
contextul unui string, adică oriunde un obiect este utilizat ca string.
Situaţia când se întoarce un string care conţine identificatorul
obiectului a fost abandonată în PHP 5.2.0. Aceasta devenise problematică
deoarece identificatorul obiectului nu poate fi considerat unic. Această
schimbare va însemna că aplicaţia dumneavoastră este defectuoasă dacă
v-aţi bazat pe identificatorul obiectului în calitate de valoare întoarsă.
Acum încercarea de a utiliza această valoare în calitate de string va
rezulta în emiterea unei erori fatale interceptabile.
Chiar şi cu __toString() obiectele nu pot fi utilizate ca indici ai tabloului sau chei. S-ar putea să adăugăm ulterior susţinerea încorporată a hash-urilor pentru aceasta, însă în PHP 5.2.x va trebui sau să creaţi propria funcţie hash, sau să utilizaţi noua funcţie SPL spl_object_hash(). Din metodele __toString() nu pot fi atuncate excepţii.
<?php
class foo {}
$foo = new foo;
print $foo;
/* Catchable fatal error: Object of class foo could
not be converted to string in filename on line n */
?><?php
class foo {
public function __toString() {
throw new Exception;
}
}
try {
print new foo;
/* Fatal error: Method foo::__toString() must
not throw an exception in filename on line n */
} catch(Exception $e) {}
?> -
Au fost abandonate funcţiile de clasă statice abstracte.
Din cauza unei scăpări, PHP 5.0.x şi 5.1.x permiteau funcţii abstracte
statice în clase. Începând cu PHP 5.2.x, numai interfeţele le pot avea.
<?php
abstract class foo {
abstract static function bar();
/* Strict Standards: Static function foo::bar()
should not be abstract in filename on line n */
}
?> - Extensia Oracle necesită prezenţa a cel puţin Oracle 10 pe Windows.
-
A fost adăugată susţinerea RFC2397 (fluxurile data:).
Introducerea schemei URL 'data' poate duce la o schimbare în comportament
sub Windows. Dacă lucraţi cu un sistem de fişiere NTFS
şi utilizaţi meta-fluxurile în aplicaţia dumneavoastră, şi dacă se
întâmplă să utlizaţi un fişier cu denumirea 'data:', accesat fără
informaţia despre cale - aceasta nu va mai funcţiona. Pentru a corecta
aceasta, utilizaţi protocolul 'file:' pentru a-l accesa.
Accesaţi de asemenea » RFC 2397
<?php
/* when allow_url_include is OFF (default) */
include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
/* Warning: include(): URL file-access is disabled
in the server configuration in filename on line n */
?> - Regresul în şabloanele glob() În versiunea 5.2.4 o corectare a unei probleme de securitate cauza un regres al şabloanelor de forma "/foo/*/bar/*". Începând cu versiunea 5.2.5 în loc de a emite o preîntâmpinare, funcţia glob() va întoarce FALSE când restricţiile openbase_dir sunt încălcate.
Schimbări incompatibile în sens invers
jbarker at erepublic dot com
21-Feb-2008 06:44
21-Feb-2008 06:44
Tachy
31-Jan-2008 08:04
31-Jan-2008 08:04
$string="12345";
$rightstring1=substr($string,-3);
$rightstring2=substr($string,-8);
echo "Result1: ".$rightstring1."<BR>";
echo "Result2: ".$rightstring2."<BR>";
PHP5.1.x:
Result1: 345
Result2: 12345
PHP5.2.x
Result1: 345
Result2: <Empty>
php dot manual at frankkleine dot de
10-Nov-2007 04:17
10-Nov-2007 04:17
Between PHP 5.2.3 and 5.2.4 another backward incompatible change was introduced: parent classes now can not access private properties of child classes with get_object_vars(). See the following example:
class Bar {
public function dumpBar() {
var_dump(get_object_vars($this));
}
}
class Foo extends Bar {
public $public = 'public';
protected $protected = 'protected';
private $private = 'private';
public function dump() {
var_dump(get_object_vars($this));
}
}
$foo = new Foo();
$foo->dump();
$foo->dumpBar();
The result with PHP < 5.2.4:
E:\php\tests>php get_object_vars.php
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
And the result with PHP >= 5.2.4:
E:\php-5.2.4-Win32>php ../php/tests/get_object_vars.php
array(3) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
["private"] => string(7) "private"
}
array(2) {
["public"] => string(6) "public"
["protected"] => string(9) "protected"
}
As you can see the private property is missing now when dumped from the parent class Bar.
Erik Osterman
29-Mar-2007 08:44
29-Mar-2007 08:44
It should be noted that if you provide a __toString method, you can cast the object to a string and use it as an array key (PHP 5.2.x).
e.g. $array[ (string)$myObject ] = 'foobar';
This is an alternative to using spl_object_hash.
