PHP prevede T_PAAMAYIM_NEKUDOTAYIM?


543

Qualcuno ha un T_PAAMAYIM_NEKUDOTAYIM?


22
A volte questo è il modo in cui PHP ti dice che ti manca un segno $ ... per esempio se scrivi _SESSION ["pippo"] invece di $ _ SESSIONE ["pippo"]
Bizzarri

131
ebraico per doppio doppio punto, ma ... vedi bugs.php.net/bug.php?id=14492 : "A proposito, c'è un errore di ortografia nell'errore di analisi, dovrebbe essere T_PAAMAYIM_NEKUDATAYIM (in ebraico, il" doppio " forma è solo il nome originale + il suffisso 'ayim' e 'nekuda' è la forma singola ['nekudot' è la forma plurale]). "
Wolfgang Fahl,

66
@WolfgangFahl Sapevo che qualcosa dell'errore sembrava sbagliato.
Peter Turner,

14
@WolfgangFahl l'errore di ortografia è solo il mancante u. Dovrebbe essere T_PAAMAYIM_NEKUDOTAYIM. ( PAAMAYIM= "due volte", NEKUDOTAYIM= := "נקודותיים")
Tom

15
Quando ho visto questo errore, ho appena fissato lo schermo senza parole per circa 30 secondi, poi sono scoppiato a ridere e sono andato a fumare una sigaretta: F 1+
n00b

Risposte:


343

È l'operatore di due punti ::(vedere l' elenco dei token di parser ).


11
Non proprio. Prova questovar_dump(empty(TRUE))
machineaddict

1
@machineaddict Domanda / risposta errata?
Gumbo,

2
No. Ho appena aggiunto una valutazione che restituisce lo stesso T_PAAMAYIM_NEKUDOTAYIM. L'ho trovato per errore.
machineaddict,

6
@Web_Developer, il motivo che accade è perché se si dispone foreach($cats as catdell'unico carattere accettabile dopo che catper un'istruzione sintatticamente valida è un ::, in quanto consentirebbe di specificare una proprietà statica di una classe chiamata cat. Ad esempio, se la catclasse ha un membro statico pubblico chiamato $mouse, allora foreach($cats as cat::$mouse)è perfettamente valido php, ma un'istruzione con qualcosa di diverso da ::dopo catsarebbe un errore di sintassi. Se $mousenon fossi una proprietà dichiarata di catte otterresti un errore fatale, ma non un errore di sintassi.
chiliNUT,

2
var_dump (vuoto (TRUE)), restituisce solo bool (false) in PHP 7.2
Programmer Dancuk

109

Google fa miracoli.

È l' ebraico per "doppio colon".


3
@MattiVirkkunen Che dire di una nuova lingua che accetta errori, si impegna, sintassi in qualsiasi lingua? :) possiamo farlo.
Ettore,

2
Google mi ha portato qui.
Sumit

2
israelis ha scritto php :)
sd1sd1,

@ sd1sd1, sì, probabilmente è Zeev a
scriverlo

53

È un nome per l' ::operatore in PHP. Significa letteralmente "doppio colon". Per qualche ragione l'hanno chiamato in ebraico. Controlla la sintassi del codice e inserisci un ::punto appropriato :-)


1
Le funzioni sono in inglese, ma l'errore è in ebraico. Non sono sicuro se ci siano altri errori in ebraico.
alex

19
La stringa di evidenziazione è להדגיש מחרוזת. D'ora in poi, userò solo la mia funzione array_push personalizzata לדחוף_מערך nei caratteri ebraici, ovviamente. Sono sicuro che tutti i miei colleghi di lingua non ebraica lo adoreranno. Quasi tutto il nostro team di sviluppatori parla almeno una lingua scritta in caratteri non latini. Dovrebbe essere divertente :)
Isaac il

3
Il motivo per cui è in ebraico è perché il codice è stato scritto da israeliani. Non credo che abbiano perso quell'errore, l'hanno lasciato lì non tradotto come promemoria.
Raul,

5
@Raul Ok, quindi sul mio prossimo progetto scriverò un codice di errore in italiano, sono italiano! Cosa ti aspetti, l'inglese dappertutto? :-)
Gianluca Ghettini,

@Ilya Birman Non significa letteralmente "doppio colon"; significa letteralmente "due volte, punti doppi"
Sapphire_Brick il

47

Da Wikipedia :

In PHP, l'operatore di risoluzione dell'ambito è anche chiamato Paamayim Nekudotayim (ebraico: פעמיים נקודתיים), che significa "doppio colon" in ebraico.

Il nome "Paamayim Nekudotayim" è stato introdotto nello Zend Engine 0.5 sviluppato in Israele, utilizzato in PHP 3. Sebbene sia stato fonte di confusione per molti sviluppatori che non parlano l'ebraico, è ancora utilizzato in PHP 5, come in questo messaggio di errore di esempio :

$ php -r :: Errore di analisi: errore di sintassi, T_PAAMAYIM_NEKUDOTAYIM imprevisto

A partire da PHP 5.4, i messaggi di errore relativi all'operatore di risoluzione dell'ambito includono ancora questo nome, ma ne hanno chiarito in qualche modo il significato:

$ php -r :: Errore di analisi: errore di sintassi, imprevisto '::' (T_PAAMAYIM_NEKUDOTAYIM)

Dalla documentazione ufficiale di PHP :

Scope Resolution Operator (chiamato anche Paamayim Nekudotayim) o, in termini più semplici, i due punti, è un token che consente l'accesso a proprietà o metodi statici, costanti e sovrascritti di una classe.

Quando si fa riferimento a questi elementi al di fuori della definizione della classe, utilizzare il nome della classe.

A partire da PHP 5.3.0, è possibile fare riferimento alla classe usando una variabile. Il valore della variabile non può essere una parola chiave (ad es. Self, parent e static).

All'inizio Paamayim Nekudotayim sembrerebbe una strana scelta per nominare un doppio colon. Tuttavia, durante la scrittura di Zend Engine 0.5 (che alimenta PHP 3), è così che il team di Zend ha deciso di chiamarlo. In realtà significa doppio colon - in ebraico!


1
In realtà è ebraico colloquiale. Wikipedia ora dice: "In PHP, l'operatore di risoluzione dell'ambito è anche chiamato Paamayim Nekudotayim (ebraico: פעמיים נקודותיים, pronunciato [paʔaˈmajim nəkudoˈtajim], la seconda parola a corruzione colloquiale di נקודתיים, pronunciata [nəkudaדיj), che significa "In ebraico".
Mic

11

Questo accade anche quando applichi una costante in PHP alla funzione empty ():

if (!empty(SOME_CONSTANT)) {

}

Quello era il mio caso. L'ho risolto usando questo:

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

}

2
Perché una costante sarebbe vuota?
Non

1
Bella domanda: questo è solo per esempio se qualcun altro si è imbattuto in questa situazione di errore, mostro solo che sarà anche possibile :)
Max

6
@ Non farti prendere dal panico: perché no? empty () verifica non solo se esiste una variabile, ma anche se il suo valore è "vuoto" (nel caso di PHP uno zero (0) è anche vuoto). Una tale costante potrebbe rappresentare un valore che deve essere modificato da un utente, come le impostazioni del DB o alcuni valori true / false e altri tipi di valore che lo sviluppatore del codice non conosce in fase di progettazione. Questo è comune per le API o i framework di codice. Non capisco perché gli sviluppatori del parser Zend non abbiano usato una parola comune che tutti conoscono e capiscono, ma invece alcune parole ebraiche. Voglio dire, non è nemmeno molto divertente o così.
StanE

Uso le costanti nei file di configurazione e voglio sapere nel codice se una costante specifica è vuota (null, false, 0, stringa vuota, array emty ....). Devo testarli tutti manualmente? WTF
qdev,

6

Conosco abbastanza bene l'ebraico, quindi per chiarire il nome "Paamayim Nekudotayim" per te, il significato parafrasato è "doppio colon", ma tradotto letteralmente:

  • "Paamayim" significa "due" o "due volte"
  • "Nekudotayim" significa "punti" (letteralmente "buchi")
    • Nella lingua ebraica, un nekuda significa un punto.
    • Il plurale è nekudot , ovvero punti che agiscono come vocali in inglese.
    • Il motivo per cui si chiama Nekudo- tayim è perché il suffisso "-ayim" significa anche "due" o "due volte", ma di solito significa due oggetti anziché due azioni, quindi ::indica "due volte, due punti" o più comunemente noto come Scope Resolution Operator .

2

Questo può accadere su foreachs quando si utilizza:

foreach( $array as $key = $value )

invece di

foreach( $array as $key => $value )

1

Per me questo è successo all'interno di una funzione di classe.

In PHP 5.3 e versioni successive $this::$defaultsfunzionava bene; quando ho scambiato il codice in un server che per qualsiasi motivo aveva un numero di versione inferiore ha generato questo errore.

La soluzione, nel mio caso, era usare la parola chiave selfinvece di $this:

self::$defaults funziona benissimo.


Ha chiesto circa $this, o quello che è successo a te ?
Sapphire_Brick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.