In den meisten Programmiersprachen haben Variablen keine identifizierenden Zeichen wie in PHP. In PHP müssen Sie einer Variablen das $
Zeichen voranstellen .
Beispiel;
var $foo = "something";
echo $foo;
Ich entwickle eine neue Skriptsprache für eine Geschäftsanwendung und meine Zielbenutzer haben keinen Programmierhintergrund. Erleichtern diese Zeichen das Lesen und Verwenden des Codes?
Ein Grund, warum PHP das verwendet, $
ist, dass PHP ohne es nicht erkennen kann, ob ein Name eine Funktionsreferenz oder eine Variablenreferenz ist. Dies liegt daran, dass die Sprache seltsame Verweise auf Funktionen zulässt. Das $
Symbol hilft dem Parser also, den Namespace zu trennen.
Ich habe dieses Problem nicht in meinem Parser. Meine Frage ist also nur die Lesbarkeit und Benutzerfreundlichkeit. Ich habe so viele Jahre in PHP programmiert, dass $foo
es mir leicht fällt, diese Variable zu identifizieren , wenn ich sie sehe . Gebe ich diesem Bezeichner nur eine Vorliebe?
quelle
sigils
heute dreimal in Gesprächen zu verwenden.var $x = ...
odertype $x = ...
dann verwenden, denke ich, ist $ Overkill. Wenn Sie es nur$x = ...
getan hätten , könnte es sich lohnen, es zu tun. Insbesondere, wenn Sie die Syntaxhervorhebung in gängigen Editoren nicht unterstützen möchten. Allerdings mag ich nichtsigils
Antworten:
Die tatsächlichen technischen Möglichkeiten und Einschränkungen sind nicht von der Art, wie sie in diesem Thread vorgeschlagen werden. Lassen Sie uns diese zuerst ausräumen.
Folgendes macht $ in PHP möglich:
$return
oder der gleichen Bezeichnung für eine Variable und eine Funktion / Konstante zB$__FILE__
Einschränkungen oder Funktionen, die nichts mit dem Präfix $ zu tun haben:
Das heißt, es gibt keinen technischen Grund, den Sie nicht haben könnten
oder
Dies ist jedoch nicht möglich (vorausgesetzt, es
return
handelt sich um ein Schlüsselwort).Ohne ernsthafte Komplikationen. Wenn Sie ein Präfix wie verwendet hätten
$
, wäre es kein Problem gewesen.Es ist eine Meinung, aber ich glaube, ein Siegel wäre es wert für Nicht-Programmierer, da es ihnen ermöglicht, Schlüsselwörter als Variablennamen zu verwenden, für sie würde es ansonsten wie eine willkürliche Einschränkung aussehen: P
quelle
return = "something";
, C # hat "kontextbezogene Schlüsselwörter", die auch eine Option ist, die es wert ist, beim Entwerfen von Sprachen überprüft zu werden.@return = "something;"
. Es gibt eine gewisse Anzahl von kontextbezogenen Schlüsselwörtern, aber alle kontextbezogen zu machen, würde eine viel kompliziertere Implementierung bedeuten.Sigils sind in Perl viel sinnvoller, da sie eine gewisse Art der Typprüfung ermöglichen. In PHP helfen sie nicht viel außerhalb des Templatings. Sie können sich ein Bild von deren Nützlichkeit und Lesbarkeit machen, indem Sie sich in verschiedenen Sprachen umsehen. Kaum jemand benutzt sie.
In einer Endbenutzersprache, an der ich arbeite, gehe ich sogar noch weiter, indem ich die Groß- und Kleinschreibung von Bezeichnern nicht beachte und Leerzeichen und Apostrophe zulasse. Auf diese Weise kann ich Variablennamen erstellen
Karl's height
, die den natürlichen Sprachen viel näher kommen.quelle
At Karl's for the night = true;
map sum
handelt es sich beispielsweise um einen teilweise angewendeten Funktionsaufruf, an den die Funktionsum
als Parameter übergeben wirdmap
. Da beide nur Bibliotheksnamen sind, konnte der Compiler bei Mehrwort-IDs nicht wissen, obmap sum
es sich um eine Mehrwort-ID oder eine Funktionsanwendung handelt, die auf zwei Einwort-IDs basiert.Vor Jahren habe ich Applesoft Basic gelernt. Zeichenfolgen wurden immer mit
$
einem Suffix versehen und Arrays mit einem Suffix von%
. So hat die Sprache funktioniert. Sie haben etwas angeschaut, Sie wussten, was es war. Ich habe mich nie zu sehr mit dem Dolmetscher befasst, um zu verstehen, warum dies der Fall war oder welche Designentscheidungen es dazu geführt haben.Das Siegel in PHP kommt von seinem Perl-Einfluss (der von
awk
und beeinflusst wurdesh
). Das Sigil in Perl ist weit mehr als nur$
das Identifizieren vieler verschiedener Typen:$
Skalar@
aufführen%
hash&
Codeblock*
TypeglobDas Siegel kennzeichnet, welchen Teil der Symboltabellenstruktur Sie betrachten. Hinter den Kulissen enthält der Symboltabelleneintrag für foo (auf den über
*foo
- den Typeglob zugegriffen wird ) alles, was ein foo sein kann. Es gibt$foo
,@foo
,%foo
, das Formatfoo
,&foo
die Dateikennung foo, etc ...Dies ermöglicht auch das Erstellen eines Alias von einer Variablen zu einer anderen:
Dies druckt
foo 1 2
- in Perl, das ist, wofür die Siegel wirklich sind , nicht, dass Sie dies tun sollten, sondern dass es diese Sache hinter den Kulissen gibt, die sie tun.Die sigils gibt es nicht so viel für die Lesbarkeit, sondern so , dass man haben kann
$foo
und@foo
ohne eine Kollision im Namensraum (vergleiche anderen Sprachen , wo man kann nicht beides habenint foo; int[] foo;
)Zeichen für die Lesbarkeit werden in jeder Sprache gelernt - beim Lesen der Syntax. Sie könnten hypothetisch erzwingen, dass der Typ selbst (als ungarische Notation) Teil des Bezeichners ist.
Etwas in Lex im Sinne von:
Und dann könnten Sie Code wie haben
Ich sage nicht, dass dies eine gute Idee ist, sondern dass jemand, der an die Sprache gewöhnt ist, dies von Haus aus lesen kann und denkt, dass es die Lesbarkeit verbessert, während jemand, der mit der Sprache nicht vertraut ist, der Meinung ist, dass es nur etwas hinzufügt ein Haufen Lärm für die Sprache.
Nachdem ich mit einer so definierten Sprache gearbeitet hatte, konnte ich sie wahrscheinlich problemlos lesen.
Manche mögen sie, manche nicht. Es gibt große heilige Kriege in verschiedenen Foren, die dies diskutieren, und es läuft wirklich darauf hinaus, wie oft Sie sie benutzt haben.
Man könnte eine neue Sprache für Nicht-Programmierer entwerfen, die Sigillen verwendet, und jeder, der noch nie zuvor programmiert hat, wird sich nie ein bisschen über sie beschweren. Auf der anderen Seite könnten Sie sie nicht als Teil der Sprache haben und Ruby- oder Perl-Programmierer könnten sich darüber beschweren, dass ihnen einige wichtige Informationen fehlen.
Es ist wirklich egal. Es kommt darauf an, wie Siegel in die Sprache passen, wenn Sie sie verwenden oder nicht. Wollen Sie können
"123 $foo 456"
oder müssen Sie"123 " + foo + " 456"
? Hier sollte die Entscheidung getroffen werden.quelle
"123 $foo 456"
wird durch das Präfix sigil nicht aktiviert und ist vollständig orthogonal dazu.$asd
die Zeichenfolgeninterpolationssyntax zu verwenden, wenn sie$
bereits für Variablenpräfixe verwendet wurde, aber es hatte nichts mit der tatsächlichen Möglichkeit zu tun, die Zeichenfolgeninterpolation überhaupt zu implementieren.#
das beispielsweise in Coffeescript verwendet wird. Und Coffeescript hat kein Präfix Variablen mit#
- in der Tat Präfix Variablen überhaupt nicht)Ich bin nicht einverstanden, dass PHP $ verwendet, um sich von funcs zu unterscheiden. Zumindest, weil PHP eine C-ähnliche Syntax hat und funcs () nach dem Namen Parens hat.
Lesen Sie diesen Beitrag über den Stapelüberlauf darüber, warum $ in PHP ist.
Viele gängige Sprachen, wie C, C ++, C #, Java, verwenden kein $ und wir können einfach var von der Funktion unterscheiden.
In PHP hilft $ zum Beispiel, wenn Sie schreiben: echo "var = $ var"
Ohne $ wird ein solcher Trick unmöglich sein.
quelle
echo "var = $var"
fn()[]
wo dies mit vernünftiger Grammatik möglich gewesen wäre, ohne darüber nachzudenken.Nach all diesen Antworten möchte ich Mathew Foscarini noch einige Punkte geben.
sind Nebenwirkungen dieses LEXER , weil es einen Token erkennen kann.
Nehmen wir als Beispiel: In SQL verwenden wir "", um Bezeichner mit reservierten Wörtern und sogar Bezeichner mit Leerzeichen "Vorname", "Gruppenname" verwenden zu können. GROUP ist ein Schlüsselwort. Es gab ein Problem - es gab eine spezielle Lösung.
PS Sehr guter Kommentar von MichaelT.
quelle
$
. Auch die "Fähigkeit, Variablen in Zeichenfolgen zu platzieren" beruht nicht darauf, dass Variablen ein Symbol wie "" vorangestellt wird$
. Das heißt,"123 $foo 456"
funktioniert auch dann, wenn die Variablensyntax wiefoo = 3
oder ist@foo = 3
. Sie sind nicht miteinander verwandt.... ein Siegel erlaubt:
Unterscheide Variablen besser von Nicht-Variablen . Menschen, die noch Grundbegriffe lernen, haben möglicherweise Schwierigkeiten herauszufinden, welche Wörter Variablen sind und welche nicht. Sie beginnen oft damit, Beispiele oder den Code anderer zu lesen, die keinen angemessenen Hintergrund haben.
Verwenden Sie reservierte Schlüsselwörter oder Funktionsnamen als Variablennamen . Manchmal stellte ich fest, dass einige dieser Namen die richtigen für eine Variable waren (dh
$count
während einecount()
Funktion definiert war) und dankte Sigils, dass ich sie verwenden durfte.quelle
$
Zeichen sein muss. Ich erinnere mich an das Dollarzeichen, das mich verwirrte, als ich ein Kind war, wegen seiner angeborenen Geldassoziation.%
könnte eine praktikable Alternative sein.