PHP erwartet T_PAAMAYIM_NEKUDOTAYIM?

542

Hat jemand eine T_PAAMAYIM_NEKUDOTAYIM?

Peter Turner
quelle
22
Manchmal sagt PHP auf diese Weise, dass Ihnen ein $ -Zeichen fehlt ... zum Beispiel, wenn Sie _SESSION ["foo"] anstelle von $ _SESSION ["foo"] schreiben
Gonzo
131
Hebräisch für Doppel-Doppelpunkt, aber ... siehe bugs.php.net/bug.php?id=14492 : " Übrigens , es gibt einen Rechtschreibfehler im Analysefehler, es sollte T_PAAMAYIM_NEKUDATAYIM sein (in Hebräisch das 'Doppel' ') Form ist nur das ursprüngliche Substantiv + das Suffix 'Ayim' und 'Nekuda' ist die Einzelform ['Nekudot' ist die Pluralform]). "
Wolfgang Fahl
66
@ WolfgangFahl Ich wusste, dass etwas über diesen Fehler nicht stimmte.
Peter Turner
14
@WolfgangFahl der Rechtschreibfehler ist nur der fehlende u. Es sollte sein T_PAAMAYIM_NEKUDOTAYIM. ( PAAMAYIM= "zweimal", NEKUDOTAYIM= := "נקודותיים")
Tom
15
Als ich diesen Fehler sah, starrte ich nur 30 Sekunden lang sprachlos auf den Bildschirm, brach dann in Lachen aus und rauchte eine Zigarette: F 1+
n00b

Antworten:

342

Es ist der Doppelpunkt-Operator ::(siehe Liste der Parser-Token ).

Gumbo
quelle
11
Nicht wirklich. Testen Sie diesvar_dump(empty(TRUE))
machineaddict
1
@machineaddict Falsche Frage / Antwort?
Gumbo
2
Nein. Ich habe gerade eine Auswertung hinzugefügt, die dieselbe T_PAAMAYIM_NEKUDOTAYIM zurückgibt. Ich habe es versehentlich gefunden.
Machineaddict
6
@Web_Developer, der Grund dafür ist, dass wenn Sie ein foreach($cats as cateinzig akzeptables Zeichen nach dem catfür eine syntaktisch gültige Anweisung haben, a ist ::, da Sie damit eine statische Eigenschaft einer aufgerufenen Klasse angeben können cat. Wenn in der catKlasse beispielsweise ein öffentliches statisches Mitglied aufgerufen wird $mouse, foreach($cats as cat::$mouse)ist dies vollkommen gültig php, aber eine Anweisung mit etwas anderem als ::dem catwäre ein Syntaxfehler. Wenn Sie $mousekeine deklarierte Eigenschaft catwären, würden Sie einen schwerwiegenden Fehler erhalten, aber immer noch keinen Syntaxfehler.
ChiliNUT
2
var_dump (leer (TRUE)), geben Sie einfach bool (false) in PHP 7.2
Programmer Dancuk
110

Google wirkt Wunder.

Es ist hebräisch für "Doppelpunkt".

patricksweeney
quelle
3
@MattiVirkkunenWas ist mit einer neuen Sprache, die Fehler, Commits und Syntax in jeder Sprache akzeptiert? :) Wir können es schaffen.
Hector
2
Google hat mich hierher gebracht.
Sumit
2
israelis schrieb php :)
sd1sd1
@ SD1SD1, ja, es ist wahrscheinlich Zeev, der das geschrieben hat
Peterchaula
53

Es ist ein Name für den ::Operator in PHP. Es bedeutet wörtlich "Doppelpunkt". Aus irgendeinem Grund nannten sie es auf Hebräisch. Überprüfen Sie Ihre Codesyntax und geben Sie ::gegebenenfalls ein :-)

Ilya Birman
quelle
1
Funktionen sind auf Englisch, aber dieser Fehler ist auf Hebräisch. Ich bin mir nicht sicher, ob andere Fehler auf Hebräisch sind.
Alex
19
Markierungszeichenfolge ist להדגיש מחרוזת. Von nun an werde ich meine benutzerdefinierte array_push-Funktion לדחוף_מערך natürlich nur noch in hebräischen Zeichen verwenden. Ich bin sicher, dass alle meine nicht hebräisch sprechenden Mitarbeiter es lieben werden. Fast unser gesamtes Entwicklerteam spricht mindestens eine Sprache, die in nicht-lateinischen Schriftzeichen geschrieben ist. Sollte Spaß machen :)
Isaac
3
Der Grund, warum es auf Hebräisch ist, ist, dass der Code von Israelis geschrieben wurde. Ich glaube nicht, dass sie diesen Fehler verpasst haben. Sie haben ihn dort zur Erinnerung unübersetzt gelassen.
Raul
5
@ Raul Ok, also schreibe ich bei meinem nächsten Projekt einen Fehlercode auf Italienisch, ich bin Italiener! Was erwartest du, Englisch überall? :-)
Gianluca Ghettini
@Ilya Birman Es bedeutet nicht wörtlich "Doppelpunkt"; es bedeutet wörtlich "zweimal, doppelte Punkte"
Sapphire_Brick
47

Aus Wikipedia :

In PHP wird der Operator für die Bereichsauflösung auch Paamayim Nekudotayim (hebräisch: פעמיים נקודתיים) genannt, was auf Hebräisch „Doppelpunkt“ bedeutet.

Der Name "Paamayim Nekudotayim" wurde in der von Israel entwickelten Zend Engine 0.5 eingeführt, die in PHP 3 verwendet wird. Obwohl er für viele Entwickler, die kein Hebräisch sprechen, verwirrend war, wird er in PHP 5 immer noch verwendet, wie in dieser Beispielfehlermeldung ::

$ php -r :: Analysefehler: Syntaxfehler, unerwartetes T_PAAMAYIM_NEKUDOTAYIM

Ab PHP 5.4 enthalten Fehlermeldungen bezüglich des Bereichsauflösungsoperators immer noch diesen Namen, haben jedoch seine Bedeutung etwas klargestellt:

$ php -r :: Analysefehler: Syntaxfehler, unerwartetes '::' (T_PAAMAYIM_NEKUDOTAYIM)

Aus der offiziellen PHP-Dokumentation :

Der Scope Resolution Operator (auch Paamayim Nekudotayim genannt) oder einfacher gesagt der Doppelpunkt ist ein Token, das den Zugriff auf statische, konstante und überschriebene Eigenschaften oder Methoden einer Klasse ermöglicht.

Verwenden Sie den Namen der Klasse, wenn Sie von außerhalb der Klassendefinition auf diese Elemente verweisen.

Ab PHP 5.3.0 ist es möglich, die Klasse mithilfe einer Variablen zu referenzieren. Der Wert der Variablen kann kein Schlüsselwort sein (z. B. self, parent und static).

Paamayim Nekudotayim scheint zunächst eine seltsame Wahl für die Benennung eines Doppelpunkts zu sein. Beim Schreiben der Zend Engine 0.5 (die PHP 3 unterstützt) hat das Zend-Team jedoch beschlossen, sie so zu nennen. Es bedeutet eigentlich Doppelpunkt - auf Hebräisch!

John Slegers
quelle
1
Es ist eigentlich umgangssprachliches Hebräisch. Wikipedia sagt jetzt: "In PHP wird der Scope Resolution Operator auch Paamayim Nekudotayim genannt (hebräisch: פעמיים נקודותיים, ausgesprochen [paʔaˈmajim nəkudoˈtajim], das zweite Wort eine umgangssprachliche Korruption von נקודתיים, ausgesprochen [nəkudaˈtajim]), was" Doppelpunkt "bedeutet "Auf Hebräisch."
Mikrofon
11

Dies kommt auch, wenn Sie eine Konstante in PHP auf die Funktion empty () anwenden:

if (!empty(SOME_CONSTANT)) {

}

Das war mein Fall. Ich habe es damit gelöst:

$string = SOME_CONSTANT;
if (!empty($string)) {

}
Max
quelle
2
Warum sollte eine Konstante leer sein?
Keine Panik
1
Schöne Frage: Dies ist nur zum Beispiel, wenn jemand anderes in diese Fehlersituation geraten ist, ich zeige nur, dass es auch möglich sein wird :)
Max
6
@ Keine Panik: Warum nicht? empty () testet nicht nur, ob eine Variable existiert, sondern auch, ob ihr Wert "leer" ist (im Falle von PHP ist auch eine Null (0) leer). Eine solche Konstante könnte einen Wert darstellen, der von einem Benutzer geändert werden soll - wie DB-Einstellungen oder einige True / False-Werte und andere Werttypen, die der Codeentwickler zur Entwurfszeit nicht kennt. Dies ist bei APIs oder Code-Frameworks üblich. Ich verstehe nur nicht, warum die Entwickler des Zend-Parsers kein allgemeines Wort verwendet haben, das jeder kennt und versteht, sondern einige hebräische Wörter. Ich meine, es ist nicht einmal wirklich lustig oder so.
StanE
Ich verwende Konstanten in Konfigurationsdateien und möchte im Code wissen, ob eine bestimmte Konstante leer ist (null, false, 0, leere Zeichenfolge, leeres Array ...). Sollte ich alle manuell testen? WTF
qdev
5

Ich kenne Hebräisch ziemlich gut. Um den Namen "Paamayim Nekudotayim" für Sie zu verdeutlichen, lautet die umschriebene Bedeutung "Doppelpunkt", aber wörtlich übersetzt:

  • "Paamayim" bedeutet "zwei" oder "zweimal"
  • "Nekudotayim" bedeutet "Punkte" (wörtlich "Löcher")
    • In der hebräischen Sprache bedeutet ein Nekuda einen Punkt.
    • Der Plural ist Nekudot , dh Punkte, die sich wie Vokale auf Englisch verhalten .
    • Der Grund, warum es Nekudotayim heißt, ist, dass das Suffix "-ayim" auch "zwei" oder "zweimal" bedeutet, aber normalerweise zwei Objekte anstelle von zwei Aktionen, also ::"zwei Mal, zwei Punkte" oder mehr allgemein bekannt als Scope Resolution Operator .
Sapphire_Brick
quelle
2

Dies kann bei foreachs passieren, wenn:

foreach( $array as $key = $value )

anstatt

foreach( $array as $key => $value )
GDY
quelle
1

Für mich geschah dies innerhalb einer Klassenfunktion.

In PHP 5.3 und höher $this::$defaults funktionierte gut; Als ich den Code in einen Server ausgetauscht habe, der aus irgendeinem Grund eine niedrigere Versionsnummer hatte, wurde dieser Fehler ausgelöst.

In meinem Fall bestand die Lösung darin, das Schlüsselwort selfanstelle von $this:

self::$defaults funktioniert gut.

bozdoz
quelle
Hat er fragen etwa $this, oder was passiert ist Sie ?
Sapphire_Brick