Prenez la version 5.2.6 de PHP.
Donnez lui à manger le code suivant :
<?php
error_reporting(E_STRICT);
abstract class truc implements iteratorAggregate
{
function __construct() {}
function load(array $array)
{
echo uniqid();
}
function getIterator()
{
return array();
}
}
class extendedTruc extends truc
{
function __construct() { parent::__construct(); }
function load($id)
{
return parent::load(array('id' => $id));
}
}
$truc = new extendedTruc();
$truc->load(rand(1, PHP_INT_MAX));
?>
Vous n'aurez aucun problème.
Maintenant, donnez à manger le même code à la version 5.2.10 de PHP.
Vous allez vous prendre en pleine tête la jolie erreur suivante :
PHP Strict standards: Declaration of extendedTruc::load() should be compatible with that of truc::load() in /usr/home/fch/tmp/test.php on line 20
Encore plus fun : supprimez la déclaration de l'interface iteratorAggregate
de votre classe truc
et donner à manger cette nouvelle version du code à la version 5.2.10 de PHP.
Vous n'aurez plus aucune erreur...
En gros, si vous déclarez une interface sur une classe de base, l'adéquation des signatures des méthodes des classes dérivées avec les signatures des méthodes de la classe de base sera vérifiées de manière très stricte si et seulement si une interface est déclarée au niveau de la classe de base, et ce même pour les méthodes qui ne font pas parties de l'interface.
Et après cela, il y en a encore qui vont dire que j'éxagère lorsque je dis que PHP, c'est de la merde...
Pour ceux que ca intéresse, le code fonctionnellement identique qui s'éxécute sans erreur avec la version 5.2.10 de PHP est le suivant :
<?php
error_reporting(E_STRICT);
abstract class truc implements iteratorAggregate
{
function __construct() {}
function load($array)
{
if (is_array($array) === false)
{
trigger_error('First argument must be an array.', E_USER_ERROR);
}
else
{
echo uniqid();
}
}
function getIterator()
{
return array();
}
}
class extendedTruc extends truc
{
function __construct() { parent::__construct(); }
function load($id)
{
return parent::load(array('id' => $id));
}
}
$truc = new extendedTruc();
$truc->load(rand(1, PHP_INT_MAX));
?>
Par contre, je vous laisse trouver l'horreur qu'il faut écrire pour pouvoir donner une valeur par défaut à l'argument de la méthode extendedTruc::load()
sans avoir d'erreur.
Et si quelqu'un peut tester avec la version 5.3.x et me mettre en commentaire de ce billet le résultat, je l'en remercie d'avance.
7 réactions
1 De desfrenes - 07/08/2009, 20:06
Ton dernier script ne génère aucune erreur sous 5.3, il sort l'id unique. Par contre le premier se comporte de la même façon:
Strict Standards: Declaration of extendedTruc::load() should be compatible with that of truc::load() in C:\Users\mickael\php\sandbox\crash.php on line 22
4a7c6d105c09c
2 De desfrenes - 07/08/2009, 22:12
"Et après cela, il y en a encore qui vont dire que j'éxagère lorsque je dis que PHP, c'est de la merde..."
J'ai trouvé un site qui explique pourquoi PHP c'est bien: http://www.noparking.net/services/p...
Sinon des petites misères avec PHP on en a tous (http://www.desfrenes.com/blog/post/...).
Il faut aussi reconnaitre que ça s'améliore (bye bye magic_quotes par exemple). Bon, ok... il y avait une grosse marge de manoeuvre ^_^
3 De mageekguy - 07/08/2009, 22:51
@desfrenes:
Les arguments marketing (falacieux) et moi faisons très mauvais ménage ;).
Et de plus, la question n'est pas de dire que PHP est mieux que tel ou tel autre langage.
Le Java, .Net, ruby, python, perl, js, C, C++ ont leur zone d'ombre, leurs inconvénients.
La question est d'être critique, car c'est la critique qui fait avancer les choses.
Et comme tu le dis justement, la marge de manoeuvre est grande, et je ne dirais pas qu'elle se réduit.
4 De desfrenes - 08/08/2009, 00:24
"je ne dirais pas qu'elle se réduit."
tu penses à quoi en particulier ? Au pif, moi je vois bien l'implémentation des namespaces mais bon... ^_^
5 De desfrenes - 11/09/2009, 14:27
ahaha... je tombe sur ce post: http://blog.eexit.net/2009/09/pourq...
Je te vois bien te déchaîné dessus
6 De mageekguy - 15/09/2009, 10:21
@desfrenes:
C'est dans le pipe ;).
7 De desfrenes - 05/10/2009, 00:06
La petite contrariété PHP du jour: http://www.desfrenes.com/blog/post/...