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.
Changements incompatibles avec les versions précédentes
Même si la majorité du code PHP 5 devrait marcher sans modification, il est recommandé de surveiller les points suivants, qui introduisent des incompatibilités avec les versions précédentes.
- La fonction getrusage() retourne NULL quand on lui passe des arguments incorrects depuis PHP 5.2.1.
- ZipArchive::setCommentName() retourne TRUE en cas de succès depuis PHP 5.2.1.
- ZipArchive::setCommentIndex() retourne TRUE en cas de succès depuis PHP 5.2.1.
- SplFileObject::getFilename() retourne le nom du fichier, et non plus le chemin relatif jusqu'au fichier, depuis PHP 5.2.1.
- Changement de priorité de la constante d'environnement PHPRC sur Windows 32. La variable d'environnement PHPRC a priorité sur la valeur enregistrée dans la base de registre Windows.
- CLI SAPI ne cherche plus dans cwd le fichier php.ini ni le fichier php-cli.ini En PHP 5.1.x, une fonctionnalité non-documentée a été ajoutée à la version CLI de PHP, pour recherche dans le dossier courant un fichier de configuration PHP, menant à des comportements inattendus, si des fichiers inopinés étaient trouvés. Cette fonctionnalité a été supprimée en PHP 5.2.0, et PHP ne cherche plus dans le dossier de travail courant le fichier php.ini ni le fichier php-cli.ini. Voyez aussi la section sur la ligne de commande du manuel.
-
Ajout d'une alerte lors de calcul de modulo 0
Dans les versions précédentes de PHP, effectuer un calcul de modulo 0
ne donnait aucun message d'alerte, mais retourne la valeur inattendue FALSE.
Depuis PHP 5.2.0, cette tentative conduit à l'émission d'un alerte de type
E_WARNING, comme lorsque des divisions par zéro sont effectuées.
<?php
print 10 % 0;
/* Warning: Division by zero in filename on line n */
?> -
Désormais, __toString() est appelé à chaque fois que c'est possible.
La méthode magique __toString() est maintenant appelée dans tout
contexte de chaîne, c'est à dire à chaque fois qu'un objet est utilisé comme chaîne
de caractères.
Le comportement par défaut qui retournait une chaîne représentant l'identifiant de
l'objet a été abandonné en PHP 5.2.0. Il était devenu problématique, car un identifiant
d'objet ne peut pas être considéré comme unique. Ce changement implique que votre
application est erronée si elle utilise les identifiants d'objets comme valeur de
retour. Une tentative d'utilisation de cette valeur comme chaîne de caractères
produit maintenant une erreur fatale.
Même avec __toString(), les objets ne peuvent pas être utilisés comme des tableaux, avec des index ou des clés. Nous envisageons d'ajouter un support natif de hachage ultérieurement, mais pour les versions 5.2.x, vous devrez fournir votre propre système, ou bien utiliser la nouvelle fonction SPL spl_object_hash(). __toString() ne peut pas émettre d'exception.
<?php
class foo {}
$foo = new foo;
print $foo;
/* Erreur fatable interceptable : les objets de classe foo ne peuvent
pas être convertis en chaîne, dans le fichier x */
?><?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) {}
?> -
Abandon des fonctions de classes statiques et abstraites.
A cause d'une inattention, PHP 5.0.x et 5.1.x permettaient les méthodes statiques
abstraites dans les classes. Depuis PHP 5.2.x, seules les interfaces peuvent en avoir.
<?php
abstract class foo {
abstract static function bar();
/* Strict Standards: Static function foo::bar()
should not be abstract in filename on line n */
}
?> - L'extension Oracle nécessite au moins la version 10 d'Oracle, sous Windows.
-
Ajout du support de la RFC2397 (flux data:).
L'introduction du flux de type 'data' peut conduire à un changement de comportement
sous Windows. Si vous travaillez avec un système de fichiers NTFS
et que vous utilisez vos propres meta-flux dans vos applications, et que vous
avez déjà baptisé l'un des fichiers du nom de 'data:', accessible dans aucune
information de chemin, sachez qu'il ne fonctionnera plus. Le correctif est d'utiliser
le protocole 'file:' pour y accéder.
Voyez aussi la » RFC 2397
<?php
/* lorsque allow_url_include vaut OFF (valeur par défaut) */
include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
/* Warning: include(): URL file-access is disabled
in the server configuration in filename on line n */
?> - Régression dans le masque glob() Dans la version 5.2.4, une mise à jour de sécurité a provoqué une régression des masques de la forme "/foo/*/bar/*". Depuis la version 5.2.5, au lieu d'émettre une alerte, la fonction glob() retourne FALSE lorsque les restrictions openbase_dir sont violées.
Changements incompatibles avec les versions précédentes
jbarker at erepublic dot com
22-Feb-2008 02:44
22-Feb-2008 02:44
Tachy
31-Jan-2008 04:04
31-Jan-2008 04: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 12:17
10-Nov-2007 12: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
30-Mar-2007 04:44
30-Mar-2007 04: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.
