Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Débat : Comment voyez-vous les espaces de noms (namespaces) en PHP 5.3 ?

Le , par RideKick

4PARTAGES

0  0 
Comment voyez-vous les espaces de noms en PHP ?
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&am...030061&w=2
Stanislav y a bien entendu répondu : http://marc.info/?l=php-internals&am...323300&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 ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de B.Moncef
Membre régulier https://www.developpez.com
Le 03/09/2008 à 15:02
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.
0  0 
Avatar de Yogui
Rédacteur https://www.developpez.com
Le 03/09/2008 à 15:09
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@
0  0 
Avatar de B.Moncef
Membre régulier https://www.developpez.com
Le 04/09/2008 à 6:12
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)).
0  0 
Avatar de Ashgenesis
Membre actif https://www.developpez.com
Le 04/09/2008 à 9:27
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.
0  0 
Avatar de Yogui
Rédacteur https://www.developpez.com
Le 04/09/2008 à 9:43
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).
0  0 
Avatar de kaymak
Membre chevronné https://www.developpez.com
Le 04/09/2008 à 11:01
Moi perso sur les namespaces je n'aimais pas trop les ::.
Je trouve que c'est confusant si le code n'est pas correctement commenté j'imagine qu'au bout d'un moment on finit par plus trop savoir si on appelle une méthode static, une classe d'un namespace, une méthode dans un namespace (?je ne sais plus si c'est possible).

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).
Les accolades représentent plus q'un simple groupement de code par thème. Elles réunissent une ou plusieurs actions qui s'éexecutent dans un espace logique.
Les namespaces je voit cela comme de l'organisation, des grosses boiboite inerte, donc de mon point de vue les accolades semblent ne pas tout à fait représenter l'utilité d'un namespace.
A contrario une classe serait une boiboite, avec des pattes et tout ce qu'il faut pour se dynamiser, et donc les accolades nous disent cela.

Et sinon pourquoi pas le point ? Par curiosité.

Un truc comme cela :
nm1.nm2.classeN::methodeZ

C'est quand même sacrément plus clair à lire et écrire que
nm1::nm2::classeN::methodeZ

non ?

bye
0  0 
Avatar de Yogui
Rédacteur https://www.developpez.com
Le 04/09/2008 à 11:10
Eh bien, puisque l'opérateur de résolution de portée en PHP est officiellement le double deux-points :: depuis quelques années, je crois que personne ne l'a remis en cause

Cela dit, il est vrai qu'il risque d'y avoir confusion selon ce que tu décris, tant du point de vue interne de PHP que du point de vue de l'utilisateur. Je suis d'accord avec toi, peut-être que sur ce point il aurait été plus clair de prendre un autre résoluteur de portée. Il aurait ainsi peut-être fallu changer le nom de l'ancien résoluteur... Cela dit, le point risque de porter confusion également, dans la mesure où il est déjà utilisé pour la concaténation et où il peut donc être utilisé en combinaison avec __toString().
0  0 
Avatar de
https://www.developpez.com
Le 05/09/2008 à 2:54
qu'elle que soit la solution envisage, desole de faire mon egris, mais je vois pas l'interet a par donne un nom a quelquechose (j'espere ne pas etre le seul a faire ca) qui se fait deja.

Je creer des class static avec mes variables et mes objets pour lequelle je veux une porter global.
Code : Sélectionner tout
1
2
3
4
5
6
7
class namespace
{
public static $var1 = "lalalala";
public static $var2 = new objet();
public static $var3 = objet2::staticClass;
}

Le truc cool que je vois dans les namespaces qu'ils veulent pondre, c'est les alias, ca va rendre le code plus lisible.

Sinon un truc cool, j'y avais penser mais par manque de temps j'ai pas pu creuser l'affaire, ce serait d'avoir une representation rdf du code et d'utiliser les namespaces du rdf dans le php en guise d'alias. A l'execution d'un script le moteur mapperais les deux doc et interpreterais. Ca pourrait resoudre bien plus de probleme de porter etc... qu des "namespaces maison".

Enfin si je suis dans le tors, expliquez moi svp.
0  0 
Avatar de B.Moncef
Membre régulier https://www.developpez.com
Le 05/09/2008 à 9:45
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.
0  0 
Avatar de kaymak
Membre chevronné https://www.developpez.com
Le 05/09/2008 à 9:58
Citation Envoyé par mon_nom_est_personne Voir le message
qu'elle que soit la solution envisage, desole de faire mon egris, mais je vois pas l'interet a par donne un nom a quelquechose (j'espere ne pas etre le seul a faire ca) qui se fait deja.

Je creer des class static avec mes variables et mes objets pour lequelle je veux une porter global.
Code : Sélectionner tout
1
2
3
4
5
6
7
class namespace
{
public static $var1 = "lalalala";
public static $var2 = new objet();
public static $var3 = objet2::staticClass;
}

Le truc cool que je vois dans les namespaces qu'ils veulent pondre, c'est les alias, ca va rendre le code plus lisible.

Sinon un truc cool, j'y avais penser mais par manque de temps j'ai pas pu creuser l'affaire, ce serait d'avoir une representation rdf du code et d'utiliser les namespaces du rdf dans le php en guise d'alias. A l'execution d'un script le moteur mapperais les deux doc et interpreterais. Ca pourrait resoudre bien plus de probleme de porter etc... qu des "namespaces maison".

Enfin si je suis dans le tors, expliquez moi svp.
C'est pas plutot rapport aux closures sa ? de pouvoir pointer une classe, une fonction dans une variable et la manipuler ?

Citation Envoyé par B.Moncef Voir le message
Si tu veux, sauf que le "namespace différent" serait en fait "aucun namespace", ce qui est différent.
Un namespace anonyme en somme, comme le fameux type stdClass

bye
0  0