PHP 5.3 : Reporting d'erreurs : E_DEPRECATED

21 octobre 2008php, php-5.3
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

Les exemples correspondant à ce point se trouvent dans le répertoire "e_deprecated".

Que serait une nouvelle version de PHP sans un nouveau niveau d'erreurs ?

Sommaire :


Nouveau niveau de rapport d'erreurs : E_DEPRECATED

PHP 5.3 introduit un nouvel error level : E_DEPRECATED.
Ce niveau d'erreur a pour but de vous permettre d'identifier plus facilement les fonctions de PHP considérées comme dépréciées, qui seront probablement supprimées lors de la sortie d'une future version -- typiquement, lors de la sortie de PHP 6.0.

Exemple de la fonction dl

Par exemple, en activant de le reporting d'erreurs E_DEPRECATED, que ce soit à l'aide de la directive error_reporting de votre fichier php.ini, ou en passant par la fonction error_reporting, la portion de code suivante léverait une erreur :

// La fonction "dl" est dépréciée en PHP 5
dl('monextension.so');

Vous obtiendrez le résultat suivant :

e_deprecated.png

En effet, la fonction dl est marquée comme dépréciée à partir de PHP 5.3, du moins lorsque PHP est utilisé en tant que module Apache.

Notez tout de même que cet exemple lèvera aussi l'avertissement suivant :

e_deprecated-warning-extension-inexistante.png

Vous vous en doutez, ceci est dû fait que l'extension monextension.so n'existe pas ; le résultat serait le même avec une extension existante (curl, soap, xdebug, ...) -- mais sans cet avertissement ^^


Quelques exemples de plus

Nous avons vu que la fonction dl était dépréciée en PHP 5.3.
Je ne dresserai pas une liste exhaustive des fonctions qui sont à présent marquées comme telles, mais voici déjà deux exemples de plus :

set_magic_quotes_runtime

La méthode set_magic_quotes_runtime est marquée comme dépréciée -- son appel lèvera un avertissement de niveau E_DEPRECATED.

En conséquence, avec la portion de code suivante :

<?php
var_dump(set_magic_quotes_runtime(1));

vous obtiendrez une sortie de ce genre :

e_deprecated-set_magic_quotes_runtime.png

Cette fonctionnalité disparaitra probablement d'ici PHP 6 ; je vous laissez consulter la RFC Magical Quotes in PHP.


Paramètres passés par référence à l'appel d'une fonction

Depuis déjà quelques années, le passage de paramètres par référence ne doit pas être effectué en utilisant un & à l'appel d'une fonction, mais à la déclaration de celle-ci.
Typiquement, prenons la portion de code suivante :

$a = 1; $b = 2;

f($a, & $b);

var_dump($a, $b);

function f($a, $b) {
    $a *= 2;
    $b *= 3;
}

En PHP 5.2, exécuter cette portion de code provoque l'affichage d'un avertissement :

call-time-pass-by-reference-5.2-e_warning.png

Ce comportement étant en fait déprécié, cet avertissement a fort logiquement été remplacé, en PHP 5.3, par un erreur de niveau E_DEPRECATED.
En exécutant la même portion de code sur une machine sous PHP 5.3, on obtient :

call-time-pass-by-reference-5.3-e_deprecated.png

Ici encore, pour plus d'informations, n'hésitez pas à consulter la RFC allow_call_time_pass_reference !


N'ignorez pas ces avertissements

Libre à vous, aujourd'hui, d'ignorer ces messages, en vous disant que votre application est développée pour PHP 5.x, et que les messages de niveau E_DEPRECATED ne vous concernent pas, puisqu'ils annoncent des fonctions qui devraient disparaitre loin dans le futur -- probablement en PHP 6...

Mais si vous en avez l'occasion, pourquoi ne pas corriger ces points ? Après tout, qui dit fonction dépréciée dit fonction plus vraiment maintenue...

Et en même temps, selon l'application sur laquelle vous travaillez, est-ce qu'il ne serait pas intéressant qu'elle fonctionne encore en PHP 6 ?

Et enfin, si ça peut réduire le nombre de machines qui seront encore en PHP 5.3 dans des années, alors que PHP 5.x sera totalement obsolète, ça ne peut être qu'une bonne idée ^^ (Pensez aux applications encore en production aujourd'hui sur des plates-formes PHP 4... Alors que PHP 4 n'est plus maintenu !)