C'est en effet à cette date que Derick a mis le feu aux poudres en ajoutant dans le trunk la modification d'Ilia qui permet la vérification de type sur les arguments numériques d'une fonction ou d'une méthode.
Il est donc maintenant possible, avec la version du trunk, d'écrire ce code :
<?php function foo(int $anInteger, float $aFloat) {...}; ?>
En résumé, il est donc maintenant possible d'imposer n'importe quel type pour les arguments d'une fonction ou d'une méthode, alors qu'il n'était possible auparavant que d'imposer une classe, une interface, ou un tableau.
L'arrivé de cette modification a donc été salué comme il se doit, d'autant que le code nécessaire était en attente depuis quasiement deux ans et que c'est une fonctionnalité très demandée par la communauté des utilisateurs.
Pourtant, tout le monde n'a pas partagé l'allégresse générale.
Deux jours après l'ajout de la modification, Zeev Zuraski a fait savoir qu'il n'était pas du tout en accord avec la philosophie de la solution implémentée.
De son point de vue, qu'il développe dans une RFC, l'implémentation choisie, qui consiste à faire générer par le langage une erreur si l'argument reçu par une fonction ou une méthode n'est pas du type attendu, va à l'encontre de la philosophie de fonctionnement de PHP en ce qui concerne le typage.
Le langage effectue en effet de sa propre initiative et de manière transparente pour le développeur les conversions nécéssaires pour que le code fonctionne correctement, du moins en ce qui concerne les types numériques.
C'est la raison pour laquelle le code suivant fonctionne parfaitement :
<?php
function foo($whateverYouWant)
{
if ($whateverYouWant > 100)
{
echo "Greater than 100 !";
}
}
foo('123bar');
?>
En conséquence, Zeev veut que la modification soit retirée du trunk et il propose une alternative.
Au lieu de vérifier le type de l'argument et de générer une erreur s'il n'est pas celui attendu par la fonction ou la méthode, il propose que l'argument soit converti par le langage dans le type attendu et qu'aucune erreur ne soit générée.
Zeev étant ce qu'il est, il dispose d'un certain poids au sein de la communauté, et il a de plus un certain nombre de fans.
Deux camps se sont donc formés, l'un militant pour la solution de Zeev et l'autre étant pour la solution d'Ilia.
Le débat a pris une telle ampleur que j'ai même eu la surprise de voir Lukas Kahwe Smith et Andi Gutmans intervenir, alors que l'un a pris sa retraite et que l'autre ne prend que très rarement par aux discussions sur la liste de diffusion des contributeurs.
Pour l'instant, aucun des deux camps n'a pris le pas sur l'autre, et la modification suscitant tant de controverses est toujours présente dans le trunk.
Cependant, l'arrivé d'Andi Gutmans dans la discussion pourrait faire évoluer les choses, sa parole faisant force de loi au sein des contributeurs.
Par ailleurs, il est à noter que malgré tout ce bordel débat, des développeurs ont continué à travailler.
L'interpréteur de commande de PHP a été amélioré et il est maintenant possible de définir l'invite de commande ainsi que l'utilitaire qui permettra d'affichier le résultat des commande page par page, de la manière suivante :
# php -a
php > #cli.pager=less
php > phpinfo();
// output will appear in the pager
php > #cli.pager=grep -i readline
php > phpcredits();
Readline => Thies C. Arntzen
php > #cli.pager=
// output appears again direct on the terminal
php > #cli.prompt=\e[032m\v \e[031m\b \e[34m\> \e[0m5.3.99-dev php >
//Colorful prompt with version number
php > #cli.prompt=`echo gethostname();` \b \>
hostname php >
Enfin, vous aurez peut-être remarqué que je ne présente plus le trunk comme étant la prochaine version majeure de PHP.
Il semble en effet que ce dernier ne soit qu'un outil de travail pour les contributeurs et que la prochaine version du langage n'inclus qu'une partie de ses fonctionnalités.
Cependant, le rôle du trunk fait apparament débat au sein même de la communauté des contributeurs.
Je suis donc en attente d'informations complémentaires sur le sujet et je vous en ferais part dès que possible.
12 réactions
1 De Dorian - 25/05/2010, 09:27
Extra comme d'hab, merci.
2 De desfrenes - 25/05/2010, 11:44
"il propose que l'argument soit converti par le langage dans le type attendu et qu'aucune erreur ne soit générée."
Un cast automatique ? Pourquoi pas.
Personnellement aucune des options ne me convient (cf le débat erreurs/exceptions)
3 De marko_ - 25/05/2010, 11:54
merci pour cette synthèse, ça évite beaucoup de lecture et c'est très informatif !
4 De NiKo - 25/05/2010, 15:10
> ... alors qu'il n'était possible auparavant que d'imposer une classe ou un tableau.
Ou une interface ahh les interfaces, ces inconnues
5 De mageekguy - 25/05/2010, 15:37
@NiKo : Pour moi, une interface est une classe, vu que l'un ne va pas sans l'autre.
Mais il est vrai que ta précision est utile, j'ai donc modifié le billet en conséquence.
6 De metagoto - 25/05/2010, 16:50
Pour les scalar type hints, il y a eu un nouveau commit hier (c'était hier je crois). On garde l'implémentation "stricte" de Ilia mais on ajoute aussi les pseudo types "scalar" et "numeric" qui eux opèrent les conversions automatiques selon des règles assez strictes tout de même.
A moins que je ne raconte des grosses conneries (toujours possible), j'ai l'impression qu'on a le meilleur des deux mondes. Il faut reconnaitre que les strict type hints sont cools pour les auteurs de librairies mais pénibles à l'usage pour les utilisateurs (obligés de caster manuellement).
J'en conclue qu'il va falloir surveiller ça de près
7 De mageekguy - 25/05/2010, 18:18
@metagoto : Je confirme le commit d'hier qui permet le type checking/hinting (pour ne froisser personne) avec
scalar
etnumeric
.Malheureusement, le billet était déjà écrit lorsque la modification a été faite.
En espérant que ca mette fin au débat...
8 De dco - 26/05/2010, 00:22
Marrant ces synthèses, on lit ça presque comme un roman
Merci, très instructif en tout cas.
9 De Rodolphe - 27/05/2010, 16:41
Encore merci pour ce rapport détaillé à la perfection (comme toujours) ! Personnellement j'aimerais qu'en PHP on puisse typer les variables dans toutes les circonstances. Les variables non typées n'est pas un atout pour un langage qui se veut professionnel. Mais il est clair que derrière cette modification qui peut sembler simple il y a un vrai changement de fond sur la façon de fonctionner de PHP. Affaire à suivre !
10 De metagoto - 28/05/2010, 00:19
@Rodolphe
Obliger les variables (et donc n'importe quelle expression) à être explicitement typées en toutes circonstances serait d'une lourdeur que je n'ose même pas imaginer Ca n'arrivera jamais.
11 De mageekguy - 28/05/2010, 14:42
@metagoto :Tout à d'accord.
Le type checking à la sauce Ilia n'a d'ailleurs à mon sens de l'intérêt que dans le cadre des classes et des fonctions.
Les auteurs de frameworks vont se régaler.
Évidement, pour cela, il faudrait que les développeurs de PHP arrête de s'amuser avec l'anus des mouches...
J'ai arrêté de compter le nombre de messages sur internals@ à ce sujet à 100.
12 De Guik - 28/05/2010, 18:27
La suite au prochaine épisode
Merci pour ce résumer de l'actu php, c'est très agréable à suivre