IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Comment voyez-vous les espaces de noms en PHP ?

Votants
20. Vous ne pouvez pas participer à ce sondage.
  • Syntaxe actuelle (sans accolades)

    8 40,00%
  • Syntaxe de la RFC (avec accolades)

    14 70,00%
  • Autoriser les hiérarchies d'espaces de noms

    9 45,00%
  • Permettre le code hors d'un namespace dans le même script

    4 20,00%
Sondage à choix multiple
Langage PHP Discussion :

Les espaces de noms en PHP 5.3 [Débat]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Par défaut Les espaces de noms en PHP 5.3
    Salut

    Depuis plusieurs mois, la discussion sur la meilleure manière d'implémenter les espaces de noms (namespaces) en PHP ne cesse d'être alimentée par de nouveaux arguments.

    Je pensais que les développeurs core trouveraient une solution simple et rapide, mais visiblement ils se heurtent à des cas d'utilisation parfaitement opposés et il leur est difficile de tomber d'accord. Une nouvelle RFC a donc vu le jour afin de proposer d'utiliser les accolades {} pour les espaces de noms (ce qui n'est pas le comportement actuel) : http://wiki.php.net/rfc/namespacecurlies

    L'implémentation actuelle est telle que je l'ai décrite dans mon cours : http://g-rossolini.developpez.com/tu...page=poo#LIV-B
    Une alternative est d'obliger l'utilisation des accolades, ce qui pose le problème de l'indentation mais qui permet d'inclure du code hors-namespace dans le même script.
    Une autre question est la hiérarchie des espaces de noms : est-ce utile, est-ce nécessaire ?

    Voici la discussion internals@ qui accompagne la nouvelle RFC : http://marc.info/?l=php-internals&m=122018993030061&w=2
    Stanislav y a bien entendu répondu : http://marc.info/?l=php-internals&m=122034228323300&w=2


    Citation Envoyé par Stanislav Malyshev
    OK, I would be happy to hear these other people - what are they use cases and what they try to do with namespace nesting. Other people, please speak.

    Qu'en pensez-vous ? Comment voyez-vous l'utilisation des namespaces en PHP ?
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  2. #2
    Membre éclairé Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Par défaut
    Personnellement je pencherais plus en faveur de la syntaxe avec accolades, principalement parce que ça permet d'avoir du code hors-namespace dans le même fichier.

    Pour ce qui est de la hiérarchie des namespaces, je ne sais pas exactement ce que c'est, je ne m'aventurerais donc pas à en parler.

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Le problème des accolades est que cela incite à indenter le code, donc a priori tout le code du script (ie. à tout décaler de 3-4 espaces ou d'une tabulation), ce qui bien évidemment est absurde

    Pour la hiérarchie, il s'agit simplement de pouvoir déclarer un espace de noms dans un autre. Il y a des exemples à la fois dans mon cours et dans le message de Stanislav (cf. liens ci-dessus).

    Concernant le code hors namespace, c'est justement le coeur de la question : dans quel cas cela te serait-il utile ? Si tu pouvais détailler et si nous avons plusieurs cas d'utilisation comme le tien, cela fera avancer la discussion sur intrnals@

  4. #4
    Membre éclairé Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Par défaut
    Je n'ai pas vraiment d'exemple pertinent sur le moment de l'utilité du code hors-namespace. S'il m'en vient un à l'esprit je ne manquerais pas de le citer.

    Si la hiérarchie des namespaces est bien adoptée, on pourrait avoir besoin de définir un namespace, et un autre namespace "enfant" de celui ci dans un même fichier. Est-ce possible sans la syntaxe avec accolades ?

    EDIT : Personnellement je vois la hiérarchie des namespaces comme complémentaire aux deux syntaxes ; Je veux dire on peut avoir la syntaxe 1 + hiérarchie, ou bien syntaxe 2 + hiérarchie.
    Mais les options du sondage actuelles la présentent comme une alternative à ces deux syntaxes. N'aurais-je pas saisi quelque chose ?

    Pour le problème d'indentation, ça dépends des personnes. Personnellement ça ne me dérangerais pas d'ajouter un léger décalage (pourquoi pas plus petit que les indentations "ordinaires" (1 espace, voir 2)).

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 183
    Par défaut
    Rajouter des accolades nous "oblige" à indenter encore d'un niveau le code ce qui peux commencer à être problématique si l'on tiens à garder des noms de variables qui veulent dire quelque chose et que l'on conserve la règle de limitation du nombre de caractère à 80. On pourrait passer à 120 comme le tolère les règles de codage Zend que j'utilise mais je ne trouve pas cela très propre.

    Pour ce qui est du code hors namespace je n'en vois pas trop l'intérêt, un code hors namespace ne serait-il pas équivalent à un code avec un namespace différent?

    C'est juste une petite réflexion et si vous avez des arguments contraires n'hésitez pas.

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Exactement, l'ajout d'un niveau d'accolades encourage l'ajout d'un niveau de tabs supplémentaires, et l'un des argmuents est en effet la limite habituelle de 80 ou 120 caractères par ligne.
    Si on décide d'avoir des accolades en faisant une exception pour l'indentation, que ce soit pour mettre une indentation plus faible ou pour la supprimer, cela va devenir très complexe à gérer dans les IDE.
    Si on décide d'avoir les accolades, ce qui semble parfaitement logique puisque les espaces de noms ressemblent à un groupement du code par blocs similaire à function, class etc., alors il n'y a aucune raison de ne pas ajouter un niveau d'indentation (surtout si on a une hiérarchie de namespaces).

    Ces arguments tournent malheureusement en rond, il n'y a pas de solution idéale, ce qu'il nous faut c'est surtout un vote des préférences de chacun
    Cela dit, nous pouvons repasser ici tous les arguments pour et contre chaque solution, je n'y vois pas d'inconvénient.

    Concernant la hiérarchie, le parseur de PHP (aussi bien l'ancien que le nouveau) peut facilement permettre à peu près ce que l'on veut. Il n'y a pas vraiment de syntaxe "impossible", il suffit simplement de bien la construire (simple à utiliser).

  7. #7
    Membre éclairé Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Par défaut
    Citation Envoyé par Ashgenesis Voir le message
    un code hors namespace ne serait-il pas équivalent à un code avec un namespace différent?
    Si tu veux, sauf que le "namespace différent" serait en fait "aucun namespace", ce qui est différent.

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    L'un des release managers de PHP 5.3 vient de faire connaître son avis :

    http://marc.info/?l=php-internals&m=122068179008600&w=2
    Citation Envoyé par Lukas Kahwe Smith
    Anyways, anyone who cares should make their opinion known on this list as clear as possible by Monday (if someone is aware of a good discussion outside of internals please also let us know), so that Johannes and I can make a decision no later than Tuesday without having to feel like dictators. Personally at this point I would leave things as is for now, move to beta and hope that this also increases the number of end users testing and giving feedback. While I hope that we dont have to do big changes after going to beta, if feedback makes it necessary, we obviously have to accept it.
    De son point de vue, les espaces de noms peuvent rester en l'état actuel, à savoir sans accolades et avec hiérarchie. Toutefois, si des personnes ressentent le besoin d'argumenter en faveur d'une autre proposition, ils doivent le faire avant lundi.

  9. #9
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Par défaut
    et pourquoi ne pas rajouter une commande facultative du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    namespace XX::YY;
      // code ici
    end namespace;
    Ça reviens à mettre le code entre des accolades mais une simple ligne, pas la peine de l'endenter.

    En ce qui concerne la pertinence de l'opérateur de résolution de portée (je dit ca pour kaymak), l'emploi du Paamayim Nekudotayim (::) dans la définition des espaces de nom parait logique.
    De toute façon ; que mettre à la place ? Quasi tous les autres symboles sont utilisés pour déclarer des comportement bien différents.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    De toute façon ; que mettre à la place ? Quasi tous les autres symboles sont utilisés pour déclarer des comportement bien différents.
    Voui c'est fort possible sa.
    Mais l'idée est plutôt de traduire la structure dans la syntaxe.
    Ce qui n'est pas réellement la cas avec ces deux points, après que ce soit le point, ou la virgule.... perso sa me passe au dessus, en PHP on utilise bien le dollar pour les variables, alors je pourrais m'accommoder j'en suis certain !

  11. #11
    Membre chevronné Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Par défaut
    Perso je trouve quand PHP les espaces de noms sont plus compliquer que dans d'autre langage genre Java et Python. Je comprend vraiment pas l'intéret d'utiliser use plus require. D'un coté on peut être content, on a maintenant des espaces de noms en PHP ce qui n'ai le cas en Ruby .

  12. #12
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par Kennel sébastien Voir le message
    D'un coté on peut être content, on a maintenant des espaces de noms en PHP ce qui n'ai le cas en Ruby .
    Si si, cela existe en Ruby, sauf qu'on utilise module plutôt que namespace (les modules servent aussi à faire du mix-in, de l'héritage multiple en quelque sorte).

    Pour l'usage de ::, je suis totalement d'accord avec Méthylbro, son choix est parfaitement logique. Il est déjà utilisé pour les méthodes et membres statiques, et dans ce contexte le nom de classe qui le précède désigne bien un espace de nom (et non un objet réel).

    Je suis par ailleurs pour l'usage des accolades ; la limite de portée d'un espace de nom doit être clairement définie, de préférence en utilisant l'élément de syntaxe ayant la même fonction dans le reste du langage.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  13. #13
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Pour rappel, le séparateur d'espaces de noms est choisi depuis quelques jours et il sera ajouté à PHP 5.3 dès la version alpha3 : le backslash \
    cf. http://www.developpez.net/forums/d63...-enfin-choisi/

    Cependant, tout n'est pas complètement défini. L'ordre de résolution des noms, en particulier, est encore sujet à débat :
    http://wiki.php.net/rfc/namespaceresolution

    La problématique est simple. Avant PHP 5.3, il n'y avait pas d'espaces de noms, il était donc impossible d'appeler une classe "utilisateur" avec le même nom qu'une classe "interne".
    En revanche, grâce aux espaces de noms, il est possible d'avoir dans la même application :
    Citation Envoyé par Script 1
    use premier\espace\de\noms\PDO;
    new PDO();
    Citation Envoyé par Script 2
    use second\espace\de\noms\PDO;
    new PDO();
    Citation Envoyé par Script 3
    use \PDO;
    new PDO();
    Puisque les instructions "use" sont facultatives, autoload rentre en jeu. Il faut donc définir un ordre de résolution des noms, en évitant les conflits et les ambiguïtés lorsque le programmeur appelle "new PDO();" sans avoir d'instruction "use".

    Avant PHP 5.3

    Pour les fonctions et les constantes, rien de plus simple :
    1) Charger le symbole
    2) Erreur fatale pour les fonctions ou notice pour les constantes
    Pour les classes, il est possible d'utiliser l'autoloading :
    1) Charger MaClasse
    2) Autoload MaClasse
    3) Erreur fatale
    À partir de PHP 5.3

    Pour les fonctions et constantes, l'avis est unanime, un seul ordre de résolution est possible pour le code suivant si le symbole maFonction n'existe ni dans l'espace de noms courant ni dans les symboles internes de PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use ns;
    echo maFonction();
    1) Charger ns::maFonction
    2) Charger \maFonction
    3) Erreur fatale pour les fonctions ou notice pour les constantes
    Pour les classes toutefois, nous avons plusieurs possibilités pour le code suivant si le symbole MaClasse n'existe ni dans l'espace de noms courant ni dans les symboles internes de PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use ns;
    new MaClasse();
    1) Charger MaClasse
    2) Autoload ns::MaClasse
    3) Erreur fatale
    1) Charger MaClasse
    2) Autoload ns::MaClasse
    3) Autoload \MaClasse
    3) Erreur fatale
    1) Charger MaClasse
    2) Autoload \MaClasse
    3) Autoload ns::MaClasse
    3) Erreur fatale
    Si j'ai bien suivi, actuellement c'est la 2° proposition qui est en place, mais la 1° a la faveur de nombreuses personnes.
    Pour ma part, je préfère la 1° proposition, même si elle oblige l'ajout d'un certain nombre de "use \PDO; use \SimpleXmlElement;..." au début de chaque script.

    Qu'en dites-vous ?

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Greg Beaver a encore une fois pris sur lui pour résumer la situation, à savoir :
    • Les problèmes rencontrés ;
    • Les solutions possibles ;
    • Ses préférences.

    Tout est dit ici : http://wiki.php.net/rfc/namespaceissues
    Chacune des solutions proposées est viable à la fois techniquement et d'un point de vue utilisateur (= développeur PHP).

    Sur la liste internals@, voici l'opinion des acteurs majeurs sur le conflit fonctions / méthodes statiques :
    • Greg Beaver : Solution 2
    • Marcus Börger : Solution 1
    • Elizabeth M Smith : Solutions 1 et 3
    • Steph Fox : Solution 3 (quoique 2 lui convient également)
    • Derick Rethans : Solution 1
    • Lars Strojny : Solution 3
    • Christian Schneider : Solution 3
    • Ben Ramsey : Solution 3
    • Stanislav Malyshev : Solution 3
    • Scott MacVicar : Solution 1
    Qu'est-ce que vous en dites ?

  15. #15
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    A posteriori, utiliser "." comme opérateur de concaténation de strings s'est avéré être un bien mauvais choix! Je fais bien sûr allusion aux namespaces de php 5.3 qui ne peuvent du coup bénéficier de "." comme opérateur de résolution.

  16. #16
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Citation Envoyé par goodpz Voir le message
    A posteriori, utiliser "." comme opérateur de concaténation de strings s'est avéré être un bien mauvais choix! Je fais bien sûr allusion aux namespaces de php 5.3 qui ne peuvent du coup bénéficier de "." comme opérateur de résolution.
    Salut

    Je comprends ta remarque mais un séparateur est un séparateur, rien de plus. Dans certains langages, le point a plusieurs significations ; en PHP, il n'en a qu'une. Dans certains langages, les espaces de noms utilisent le point ; dans d'autres, c'est un autre caractère ; en PHP, c'est le backslash. Il n'y a pas de bonne ou de mauvaise décision là-dedans, c'est simplement ainsi.

    En réalité, il est du domaine du possible pour le PHP Group d'utiliser le point comme séparateur pour les espaces de noms, sans causer de conflit avec ses autres utilisations. Cependant, ce serait au prix de performances déplorables et d'un code source totalement unmaintenable dans le noyau du langage PHP... C'est exactement ce dont souffrent d'autres langages mais, puisque la plupart sont compilés, cela ne se ressent que par un temps de compilation (légèrement plus) élevé : le temps d'exécution des programmes n'est pas affecté. Cet aspect serait bien plus grave pour PHP (= ralentissement à chaque exécution), c'est pourquoi cette solution complexe n'est pas envisageable.

  17. #17
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Je comprends ta remarque mais un séparateur est un séparateur, rien de plus. Dans certains langages, le point a plusieurs significations ; en PHP, il n'en a qu'une. Dans certains langages, les espaces de noms utilisent le point ; dans d'autres, c'est un autre caractère ; en PHP, c'est le backslash. Il n'y a pas de bonne ou de mauvaise décision là-dedans, c'est simplement ainsi.
    Faut quand même reconnaître que l'apparition et surtout l'adoption du backslash pour les namespaces a engendré des réactions de rejet parfois virulentes au sein de la communauté. Je ne pense pas qu'on aurait eu les mêmes réactions si l'opérateur "." avait pu être pleinement disponible.
    En ce qui me concerne, j'utilise les namespaces de php 5.3 depuis un moment déjà (également lorsque "::" était implémenté). Je m'y suis fait rapidement, d'autant plus que j'ai suivi les débats sur la mailing internals et suis donc un minimum au courant des choix pratiques sous-jacents. Mais quand même, "." ça l'aurait mieux fait

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/12/2009, 04h25
  2. Réponses: 4
    Dernier message: 27/11/2008, 02h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo