Dans la plupart des langages de programmation, les variables n'ont pas de caractères d'identification comme elles le font en PHP. En PHP, vous devez préfixer une variable avec le $
caractère.
Exemple;
var $foo = "something";
echo $foo;
Je développe un nouveau langage de script pour une application métier, et mes utilisateurs cibles n'ont pas d'expérience en programmation. Ces caractères facilitent-ils la lecture et l'utilisation du code?
Une raison pour laquelle PHP utilise le $
est parce que sans lui, PHP ne peut pas dire si un nom est une référence de fonction ou une référence de variable. En effet, le langage autorise d'étranges références aux fonctions. Le $
symbole aide donc l'analyseur à séparer l'espace de noms.
Je n'ai pas ce problème dans mon analyseur. Ma question porte donc uniquement sur la lisibilité et la facilité d'utilisation. J'ai codé pendant tant d'années en PHP que quand je vois, $foo
il est facile pour moi de l'identifier comme une variable. Suis-je en train de donner une préférence de biais à cet identifiant?
la source
sigils
trois fois aujourd'hui dans les conversations.var $x = ...
outype $x = ...
alors je pense que $ est exagéré. Si vous venez de le faire,$x = ...
cela pourrait valoir la peine. Surtout si vous ne souhaitez pas prendre en charge la coloration syntaxique dans les éditeurs courants. Cependant, de préférence, je n'aime passigils
Réponses:
Les possibilités et limitations techniques réelles ne sont pas du tout comme celles suggérées tout au long de ce fil. Débarrassons-les d'abord.
Voici ce que $ rend possible en PHP:
$return
ou pouvant utiliser le même nom pour une variable et une fonction / constante par exemple$__FILE__
Limitations ou fonctionnalités sans rapport avec le préfixe $:
Cela signifie qu'il n'y a aucune raison technique que vous ne pourriez pas avoir
ou
Cependant, vous ne pouvez pas en avoir (en supposant qu'il
return
s'agit d'un mot-clé)Sans complications graves. Si vous avez utilisé un préfixe comme
$
, cela n'aurait posé aucun problème.C'est une opinion mais je crois qu'un sceau en vaudrait la peine pour les non-programmeurs car il leur permet d'utiliser des mots clés comme noms de variables, pour eux, cela ressemblerait autrement à une limitation arbitraire: P
la source
return = "something";
, C # a des "mots-clés contextuels", qui sont également une option à vérifier lors de la conception des langages.@return = "something;"
. Il existe une certaine quantité de mots-clés contextuels, oui, mais les rendre tous contextuels signifierait une mise en œuvre beaucoup plus compliquée.Les sigils ont en fait beaucoup plus de sens en perl, où ils fournissent une certaine quantité de vérification de type. En php, ils n'aident pas beaucoup en dehors des modèles. Vous pouvez avoir une idée de leur utilité et de leur lisibilité en examinant différentes langues. Presque personne ne les utilise.
Dans un langage ciblé sur les utilisateurs finaux sur lequel je travaille, je vais même plus loin, rendant les identifiants insensibles à la casse et autorisant les espaces et les apostrophes. Cela me permet de faire des noms de variables comme
Karl's height
ça beaucoup plus proches des langages naturels.la source
At Karl's for the night = true;
map sum
est un appel de fonction partiellement appliqué - la fonctionsum
est passée en paramètre àmap
. Mais les deux ne sont que des noms de bibliothèque, donc avec des identifiants multi-mots, le compilateur ne pouvait pas savoir s'ilmap sum
s'agit d'un identifiant multi-mots ou d'une application de fonction basée sur deux identifiants un seul mot.Il y a des années, j'ai appris Applesoft Basic. Les chaînes étaient toujours suffixées
$
et les tableaux avaient un suffixe de%
. C'est comme ça que la langue fonctionnait. Vous avez regardé quelque chose, vous saviez ce que c'était. Je ne suis jamais allé trop loin dans l'interprète pour comprendre pourquoi c'était le cas ou les décisions de conception qui l'ont fait.Le sceau en php provient de son influence perl (qui a été influencée par
awk
etsh
). Le sceau en perl est bien plus que juste$
car il peut identifier de nombreux types différents:$
scalaire@
liste%
hacher&
bloc de code*
typeglobLe sceau identifie la partie de la structure de la table des symboles que vous regardez. Dans les coulisses, l'entrée de la table des symboles pour foo (accessible via
*foo
- le typeglob) a tout ce qui peut être un foo. Il y a$foo
,@foo
,%foo
, le formatfoo
de ,&foo
, le descripteur de fichier foo, etc ...Cela permet également de créer un alias d'une variable à une autre:
Cela imprime
foo 1 2
- en perl, c'est à cela que servent vraiment les sceaux , non pas que vous fassiez cela mais plutôt qu'il y a cette chose en coulisses qu'ils font.Les sceaux ne sont pas tellement là pour la lisibilité, mais plutôt pour que l'on puisse avoir
$foo
et@foo
sans avoir une collision dans l'espace de noms (comparer d'autres langages où l'on ne peut pas avoir les deuxint foo; int[] foo;
)Les cachets de lisibilité sont quelque chose qui s'apprend dans le cadre de n'importe quel langage - lire la syntaxe. Vous pourriez, hypothétiquement, imposer le type lui-même (en notation hongroise) pour faire partie de l'identifiant.
Quelque chose dans lex le long des lignes de:
Et puis vous pourriez avoir du code comme
Je ne dis pas que c'est une bonne idée, mais plutôt que quelqu'un qui est habitué à la langue pourra le lire nativement et penser que cela améliore la lisibilité tandis que quelqu'un qui n'est pas familier avec la langue peut penser que cela ajoute simplement un tas de bruit à la langue.
Cependant, après avoir travaillé avec une langue définie de cette façon, je pourrais probablement la lire sans problème.
Certaines personnes les aiment, d'autres non. Il y a de grandes guerres saintes dans divers forums qui en débattent et cela se résume vraiment à combien vous les avez utilisées.
On pourrait concevoir un nouveau langage pour les non-programmeurs qui utilise des sceaux et quiconque n'a jamais programmé auparavant ne s'en plaindra jamais. D'un autre côté, vous ne pouvez pas les avoir dans le langage et demander aux programmeurs ruby ou perl de se plaindre de manquer des informations clés.
Ça n'a vraiment pas d'importance. Ce qui importe, c'est la façon dont les sceaux s'intégreraient dans la langue, que vous les utilisiez ou non. Voulez-vous pouvoir faire
"123 $foo 456"
ou devez-vous faire"123 " + foo + " 456"
? C'est là que la décision doit être prise.la source
"123 $foo 456"
n'est pas activée par le préfixe sigil et est complètement orthogonale à celui-ci.$asd
dans la syntaxe d'interpolation de chaîne si elle$
était déjà utilisée pour les préfixes de variable, mais cela n'avait rien à voir avec la possibilité réelle d'implémenter l'interpolation de chaîne en premier lieu.#
utilisé dans coffeescript par exemple. Et coffeescript ne préfixe pas variables avec#
- en fait, il ne préfixe pas du tout les variables)Je ne suis pas d'accord que PHP utilise $ pour différencier les vars des funcs. Du moins parce que PHP a une syntaxe de type C, et funcs () a des parens après le nom.
Lisez cet article sur le débordement de pile pour savoir pourquoi $ est en PHP.
De nombreux langages populaires, tels que C, C ++, C #, Java n'utilisent pas $ et nous pouvons différer facilement de la fonction.
En PHP $ aide, par exemple, lorsque vous écrivez: echo "var = $ var"
Sans $, une telle astuce sera impossible.
la source
echo "var = $var"
fn()[]
où, comme avec une grammaire sensée, cela aurait fonctionné sans même y penser.Après toutes ces réponses, je veux donner plus de points à Mathew Foscarini.
sont des effets secondaires de ce LEXER , car il est capable de reconnaître un jeton.
Prenons l'exemple: en SQL, nous utilisons "" pour pouvoir utiliser des identifiants avec des mots réservés et même des identifiants avec des espaces "First Name", "Group Name". GROUPE est un mot-clé. Il y avait un problème - il y avait une solution spéciale.
PS Très bon commentaire de MichaelT.
la source
$
. De plus, la «possibilité de placer une variable à l'intérieur d'une chaîne» n'est pas due au fait que les variables sont préfixées par un symbole comme$
. Autrement dit,"123 $foo 456"
fonctionnera si même si la syntaxe des variables est commefoo = 3
ou@foo = 3
. Ils ne sont pas liés les uns aux autres.... un sceau permet de:
Mieux distinguer les variables des non-variables . Les personnes qui apprennent encore des concepts de base pourraient avoir du mal à déterminer quels mots sont des variables et lesquels ne le sont pas. Ils commencent souvent par lire des exemples ou du code d'autres personnes sans fond adéquat.
Utilisez des mots clés réservés ou des noms de fonction comme noms de variables . Parfois, j'ai trouvé que certains de ces noms étaient les bons pour une variable (c'est-à-dire
$count
pendant qu'unecount()
fonction était définie) et j'ai remercié les sceaux de m'avoir permis de les utiliser.la source
$
signe. Je me souviens du signe du dollar qui m'a dérouté quand j'étais enfant à cause de son association inhérente à l'argent.%
pourrait être une alternative réalisable.