Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
Vieux 10/08/2010, 15h09   #1
Responsable Actualités
 
Avatar de Idelways
 
Développeur Ruby on Rails / iOS et journaliste
Inscription : juin 2010
Messages : 1 053
Détails du profil
Informations professionnelles :
Activité : Développeur Ruby on Rails / iOS et journaliste

Informations forums :
Inscription : juin 2010
Messages : 1 053
Points : 23 760
Points : 23 760
Par défaut La syntaxe du PHP évolue avec la possibilité de déréférencer des tableaux : pour ou contre ?

Quelle évolution de la syntaxe de PHP souhaiteriez-vous ?
Déréférencement, éviction du « dollar », tableaux sans Array ou une autre ?



PHP offre un large panel de possibilités mais sa syntaxe est relativement rigide et (pour certains) « verbeuse » comparée aux autres langages dynamiques concurrents.

Johannes Schlüter travaille sur MySQL à Oracle/Sun et fait partie de la core-team (l'équipe de développement) de PHP. Il vient de présenter sur son blog une nouveauté qui sera intégrée aux versions futures du langage (5.4 ou 6, il ne précise pas).

Il s'agit de la possibilité de déréférencer des tableaux. Comme parfois un bout de code peut en dire plus qu'un long discours, il sera possible de faire :

Code :
1
2
3
4
5
 
<?php
$func = function() { return array('a', 'b', 'c'); };
echo $func()[0]; // prints a
?>
Alors qu'avant, la déclaration d'une $variable intermédiaire était obligatoire, cette nouveautés permettra plus de flexibilité lors de la programmation objet en PHP.

L'annonce de cette fonctionnalité soulève à la fois enthousiasme et critiques dans la communauté qui semble extrêmement partagée sur cette évolution.

Votre avis nous intéresse donc sur cette question : êtes-vous pour ou contre.

Et plus généralement, quelles sont les possibilités que vous souhaiteriez voir apparaitre dans les prochaines versions de PHP ?


Sources : Blog de Johannes Schlüter

Lire aussi :

Quelle est la solution PHP la plus obscure que vous ayez utilisée ? Scripts, CMS maisons ou langages "PHP-Killer" ?

Avez-vous inventé des termes que seuls vous et votre équipe comprenez ? Drôles ou techniques, expliquez-les nous

Les rubriques (actu, forums, tutos) de Développez :

PHP
Développement WEB
Langages
Idelways est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2010, 15h35   #2
Membre du Club
 
Inscription : avril 2003
Messages : 114
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 114
Points : 61
Points : 61
J'ai du mal à voir l'intérêt de cette syntaxe.
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 10/08/2010, 15h40   #3
Expert Confirmé Sénior
 
Avatar de _skip
 
Homme
Développeur d'applications
Inscription : novembre 2005
Messages : 2 233
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Suisse

Informations professionnelles :
Activité : Développeur d'applications
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : novembre 2005
Messages : 2 233
Points : 4 382
Points : 4 382
Juste éviter de passer par une variable temporaire.
taper

Code :
$firstChild = $parent->getChildren()[0]
Au lieu de

Code :
1
2
$maVariableQuiPollue = $parent->getChildren()[0]
$firstChild = $maVariableQuiPollue[0];
_skip est actuellement connecté   Envoyer un message privé Réponse avec citation 30
Vieux 10/08/2010, 15h49   #4
Membre confirmé
 
Avatar de bombseb
 
Inscription : juillet 2005
Messages : 365
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 365
Points : 291
Points : 291
Je trouve que niveau lisibilité c'est pas top moi
bombseb est déconnecté   Envoyer un message privé Réponse avec citation 22
Vieux 10/08/2010, 15h50   #5
Membre régulier
 
Inscription : mars 2007
Messages : 110
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 110
Points : 88
Points : 88
Ça m'est déjà arrivé de râler parce que ça n'était pas possible de faire ça!
Et je ne programme qu'en PHP.

Est-ce que ça engendre d'autres problèmes? Moi je n'en vois pas.

Dernière modification par Mejdi20 ; 10/08/2010 à 18h11.
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2010, 15h52   #6
Membre du Club
 
Inscription : avril 2003
Messages : 114
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : avril 2003
Messages : 114
Points : 61
Points : 61
je demande juste :
et pourquoi ne pas faire en sorte que la fonction en question accepte un offset en paramètre comme on peut le faire depuis des lustres ?. on aurait

Code :
1
2
 
$var = $parent->getChildren(0);
plus clair à mon sens que de rajoute cette syntaxe, qui supprime une ligne de code, pas forcément inutile puisqu'elle rend le code plus compréhensible.
r-zo est déconnecté   Envoyer un message privé Réponse avec citation 04
Vieux 10/08/2010, 15h54   #7
Nouveau Membre du Club
 
Inscription : juillet 2006
Messages : 51
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 51
Points : 38
Points : 38
C'est pas tant la visibilité qui m'interpelle, pour ma part, c'est plus le fait que:
1 - Ce genre de "raccourci" incite au code brouillon
2 - Une source de bug potentielle
odissey est déconnecté   Envoyer un message privé Réponse avec citation 44
Vieux 10/08/2010, 16h01   #8
Membre confirmé
 
Avatar de Jcpan
 
Inscription : août 2008
Messages : 481
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 481
Points : 248
Points : 248
Citation:
Envoyé par odissey Voir le message
C'est pas tant la visibilité qui m'interpelle, pour ma part, c'est plus le fait que:
1 - Ce genre de "raccourci" incite au code brouillon
2 - Une source de bug potentielle
rien n'oblige à l'utiliser
Jcpan est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 10/08/2010, 16h03   #9
Membre confirmé
 
Jacques André
Inscription : novembre 2007
Messages : 196
Détails du profil
Informations personnelles :
Nom : Jacques André
Âge : 29

Informations forums :
Inscription : novembre 2007
Messages : 196
Points : 292
Points : 292
Envoyer un message via MSN à CIFQ_Drew
Pour ma part cela semble fort interessant. Ce n'est certe pas une révolution, mais j'aime d'autant mieux cette syntaxe que l'utilisation d'une variable temporaire. Quand on sait qu'une fonction retourne un tableau j'aime bien l'utiliser immédiatement comme tel (comme lorsqu'une fonction retourne un objet).
CIFQ_Drew est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2010, 16h07   #10
Membre actif
 
Avatar de Causa Sui
 
Inscription : mai 2003
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 133
Points : 171
Points : 171
Citation:
Envoyé par odissey Voir le message
C'est pas tant la visibilité qui m'interpelle, pour ma part, c'est plus le fait que:
1 - Ce genre de "raccourci" incite au code brouillon
2 - Une source de bug potentielle
... accessoirement aussi moins de code à taper, la possibilité d’une optimisation en interne (suppression d’une référence).

J'ai encore râlé il n'y a pas une heure parce que ça n'existait pas*; et qui plus est, cette syntaxe est tout à fait logique et courante (notamment en Ruby ou en Javascript pour ne citer qu’eux).
Causa Sui est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/08/2010, 16h09   #11
Membre éprouvé
 
Benjamin Thuillier
Inscription : juillet 2010
Messages : 192
Détails du profil
Informations personnelles :
Nom : Benjamin Thuillier
Âge : 23
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : juillet 2010
Messages : 192
Points : 461
Points : 461
vraiment pratique quand on veut récuperer que certains élément du tableau retourné.
gilwath est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2010, 16h10   #12
Nouveau Membre du Club
 
Jonathan Petitcolas
Inscription : juillet 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jonathan Petitcolas
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2009
Messages : 23
Points : 25
Points : 25
Envoyer un message via Skype™ à Jonathan Petitcolas
Je ne vois pas bien les problèmes que cette écriture peut engendrer ? Si quelqu'un pouvait m'éclairer là-dessus ?

Car, au contraire, cela évite de passer par une variable temporaire, et donc de faire une économie de mémoire. J'ai été très étonné que PHP n'accepte pas cette écriture il y a de cela quelques temps, écriture que je trouve... naturelle.

Par contre, le nom donné... "déréférencement de tableaux"... C'est du lourd ! ^^
Jonathan Petitcolas est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 10/08/2010, 16h17   #13
Membre chevronné
 
Étudiant
Inscription : septembre 2006
Messages : 491
Détails du profil
Informations personnelles :
Âge : 18

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2006
Messages : 491
Points : 770
Points : 770
Je me permets de citer un commentaire sur le lien de reddit.com :
Citation:
I always wondered what PHP's parser must look like if it doesn't automatically support this
Traduction :
Citation:
Je me suis toujours demandé à quoi doit ressembler le parser de PHP, s’il ne gère pas automatiquement cela.
spidermario est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/08/2010, 16h22   #14
Nouveau Membre du Club
 
Grégoire Pineau
Inscription : juin 2007
Messages : 36
Détails du profil
Informations personnelles :
Nom : Grégoire Pineau
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2007
Messages : 36
Points : 31
Points : 31
Je ne vois pas du tout pourquoi trouver cette méthode "brouillon". Je la trouve très pratique et l'attends avec impatience.

Dernière modification par Mejdi20 ; 10/08/2010 à 18h13.
lyrix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/08/2010, 16h25   #15
Futur Membre du Club
 
Inscription : août 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 3
Points : 16
Points : 16
Citation:
Envoyé par Jonathan Petitcolas Voir le message
Je ne vois pas bien les problèmes que cette écriture peut engendrer ? Si quelqu'un pouvait m'éclairer là-dessus ?

Car, au contraire, cela évite de passer par une variable temporaire, et donc de faire une économie de mémoire. J'ai été très étonné que PHP n'accepte pas cette écriture il y a de cela quelques temps, écriture que je trouve... naturelle.

Par contre, le nom donné... "déréférencement de tableaux"... C'est du lourd ! ^^
Juste que la fonction n'a pas intérêt à retourner "null" ...

il est d'usage de tester le retour des fonctions avant de l'utiliser...et pour cela on a besoin d'une variable temporaire si on ne veut pas invoquer la fonction deux fois

En somme:
Code :
$firstChild = $parent->getChildren()[0]
devrait etre écrit
Code :
1
2
3
4
 
$children = $parent->getChildren();
if ($children != null)
   $firstChild = $children[0];
En outre si on n'utilise jamais que le premier element d'une liste retournée par une fonction, c'est qu'on a quelque part un probleme d'architecture....

Cela dit PHP a toujours été un langage permissif et c'est une de ses forces, dans le cadre d'un développement "script" ou on est "quasi-certain" du retour, cela reste acceptable, mais il est comme toujours necessaire de comprendre le probleme éventuel que peut poser cette confiance aveugle

Dernière modification par Mejdi20 ; 10/08/2010 à 18h20.
tfabien est déconnecté   Envoyer un message privé Réponse avec citation 51
Vieux 10/08/2010, 16h29   #16
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 165
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 26

Informations forums :
Inscription : mai 2006
Messages : 165
Points : 182
Points : 182
Très content de cette nouvelle syntaxe. Très utilisé en Javascript dans les parcours de DOM, j'y vois une facilité de langage vraiment utile. Pour ma part j'espère surtout que ce changement permettra également la syntaxe simplifiée foreach directement sur un champ de type tableau lors d'un passage à travers un __get().

Actuellement il n'est pas possible d'écrire foreach($object->table as ...) selon le type de visibilité des champs de l'objet. Je suppose que la nouvelle syntaxe devrait permettre ça.
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/08/2010, 16h32   #17
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 165
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 26

Informations forums :
Inscription : mai 2006
Messages : 165
Points : 182
Points : 182
Citation:
et pour cela on a besoin d'une variable temporaire si on ne veut pas invoquer la fonction deux fois
on peut très bien faire un test "count() && ..." sur le tableau. Appeler 2 fois ne pose pas de problème tant que le résultat n'est pas re-calculé et doublé dans la mémoire par le second appel. Le retour d'une table se faisant par référence, appeler 2 fois sur un champ d'objet par exemple ne me paraît pas gourmant en ressources.

Citation:
Envoyé par tfabien Voir le message

En outre si on n'utilise jamais que le premier element d'une liste retournée par une fonction, c'est qu'on a qqpart un probleme d'architecture....
Je pense que tu peux remplacer [0] par [i] ou [$object->var] ou nimporte quel autre appel retournant string ou integer.
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 10/08/2010, 16h35   #18
Futur Membre du Club
 
Inscription : août 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 3
Points : 16
Points : 16
Citation:
Envoyé par Lordsephiroth Voir le message
Je pense que tu peux remplacer [0] par [i] ou [$object->var] ou nimporte quel autre appel retournant string ou integer.
Code :
1
2
3
 
for ($i=0; $i < $parent->getChildren()[$i] != null; $i++)
   print $parent->getChildren()[$i];
Combien de fois est appellée la fonction getChildren?
Si derriere elle va chercher les données en base ca peut vite devenir un souci

D'ou
Code :
1
2
3
4
 
$children = $parent->getChildren();
for ($i=0; $children != null && $children[$i] != null; $i++)
   print $children[$i];
Dans un cadre clef->valeur ca peut etre plus interessant/acceptable effectivement
tfabien est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/08/2010, 16h42   #19
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 165
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 26

Informations forums :
Inscription : mai 2006
Messages : 165
Points : 182
Points : 182
Citation:
Envoyé par tfabien Voir le message
Si derriere elle va chercher les données en base ca peut vite devenir un souci
En fait je me focalise sur mon exemple de la syntaxe foreach() pour un champ d'objet private ou protected retourné par __get(). Cette syntaxe m'a toujours cruellement manqué et comme __get() retourne juste par référence un champ d'objet de type tableau, il n'y a pas de soucis à le faire.

Gaffe à l'appel de base de données en effet.

Edit : j'avoue que je n'ai pas la moindre idée si le changement de syntaxe permettra la syntaxe simplifiée foreach() pour les champs protected ou private, mais je suppose que c'est lié... le foreach doit bien être traduit par un for standard avec un appel [i] en pré-processing...
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2010, 16h48   #20
Membre régulier
 
Inscription : mars 2007
Messages : 110
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : mars 2007
Messages : 110
Points : 88
Points : 88
Citation:
Envoyé par Lordsephiroth Voir le message
Actuellement il n'est pas possible d'écrire foreach($object->table as ...) selon le type de visibilité des champs de l'objet. Je suppose que la nouvelle syntaxe devrait permettre ça.
C'est plutôt logique de ne pas pouvoir accéder directement à une propriété d'object si elle est en protected ou private.
Et je ne vois pas en quoi cette nouvelle syntaxe changerait la donne
!?
dolu02 est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Actualité déjà publiée
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 18h24.


 
 
 
 
Partenaires

Hébergement Web