PHP oczekuje T_PAAMAYIM_NEKUDOTAYIM?

542

Czy ktoś ma T_PAAMAYIM_NEKUDOTAYIM?

Peter Turner
źródło
22
Czasami jest to sposób, w jaki PHP mówi ci, że brakuje ci znaku $ ... na przykład, jeśli napiszesz _SESSION [„foo”] zamiast $ _SESSION [„foo”]
Gonzo
131
hebrajski dla podwójnego podwójnego dwukropka, ale ... patrz bugs.php.net/bug.php?id=14492 : „BTW, w błędzie parsowania występuje błąd ortograficzny, powinien to być T_PAAMAYIM_NEKUDATAYIM (w hebrajskim„ podwójne ” forma jest po prostu rzeczownikiem oryginalnym + sufiks „aim”, a „nekuda” jest pojedynczą formą [„nekudot” jest liczbą mnogą]). ”
Wolfgang Fahl
66
@WolfgangFahl Wiedziałem, że coś o tym błędzie wydaje się nie w porządku.
Peter Turner
14
@WolfgangFahl błąd ortograficzny to tylko brak u. Powinno być T_PAAMAYIM_NEKUDOTAYIM. ( PAAMAYIM= "dwa razy", NEKUDOTAYIM= := "נקודותיים")
Tom
15
Kiedy zobaczyłem ten błąd, przez 30 sekund wpatrywałem się w ekran oszołomiony, a potem wybuchnąłem śmiechem i poszedłem zapalić papierosa: F 1+
n00b

Odpowiedzi:

342

Jest to operator podwójnego dwukropka ::(patrz lista tokenów analizatora składni ).

Gumbo
źródło
11
Nie całkiem. Sprawdź tovar_dump(empty(TRUE))
machineaddict
1
@machineaddict Niewłaściwe pytanie / odpowiedź?
Gumbo
2
Nie. Właśnie dodałem ocenę, która zwraca ten sam T_PAAMAYIM_NEKUDOTAYIM. Znalazłem to przez pomyłkę.
machineaddict
6
@Web_Developer dzieje się tak dlatego, że jeśli masz foreach($cats as catjedyną akceptowalną postać po catfor dla poprawnej składniowo instrukcji jest ::, ponieważ pozwoliłoby to na określenie właściwości statycznej jakiejś klasy o nazwie cat. Na przykład, jeśli catklasa ma publiczny element statyczny o nazwie $mouse, to foreach($cats as cat::$mouse)jest całkowicie poprawna php, ale instrukcja z czymkolwiek innym niż ::po catbyłaby błędem składni. Gdyby $mousenie były zadeklarowaną własnością cat, otrzymalibyśmy błąd krytyczny, ale nadal nie byłby to błąd składniowy.
chiliNUT
2
var_dump (pusty (PRAWDA)), po prostu zwróć bool (false) w PHP 7.2
programista Dancuk
110

Google działa cuda.

Jest hebrajski dla „podwójnego dwukropka”.

patricksweeney
źródło
3
@MattiVirkkunen Co z nowym językiem, który akceptuje każdy błąd, zatwierdza, składnia w dowolnym języku? :) możemy to zrobić.
Hector
2
Google mnie tu przywiodło.
Sumit
2
israelis napisał php :)
sd1sd1
@ sd1sd1, tak, prawdopodobnie Zeev to napisał
peterchaula,
53

To nazwa ::operatora w PHP. To dosłownie oznacza „podwójny dwukropek”. Z jakiegoś powodu nazwali go po hebrajsku. Sprawdź składnię kodu i wpisz ::odpowiednie :-)

Ilya Birman
źródło
1
Funkcje są w języku angielskim, ale ten błąd jest w języku hebrajskim. Nie jestem jednak pewien, czy jakieś inne błędy są w języku hebrajskim.
alex
19
Ciąg wyróżnienia to להדגיש מחרוזת. Od tej pory oczywiście będę używać mojej niestandardowej funkcji array_push לדחוף_מערך w hebrajskich znakach. Jestem pewien, że wszyscy moi nie hebrajskojęzyczni współpracownicy pokochają to. Prawie cały nasz zespół programistów mówi przynajmniej jednym językiem napisanym alfabetem innym niż łaciński. Powinny być fajne :)
Izaak
3
Powodem, dla którego jest w języku hebrajskim, jest to, że kod został napisany przez Izraelczyków. Nie sądzę, że przegapili ten błąd, zostawili go tam nieprzetłumaczony jako przypomnienie.
Raul
5
@Raul Ok, więc przy następnym projekcie napiszę kod błędu po włosku, jestem Włochem! Czego oczekujesz, angielski wszędzie? :-)
Gianluca Ghettini
@Ilya Birman To nie znaczy dosłownie „podwójny dwukropek”; oznacza dosłownie „dwa razy, podwójne kropki”
Sapphire_Brick
47

Z Wikipedii :

W PHP operator rozdzielczości zakresu nazywa się również Paamayim Nekudotayim (hebr. פעמיים נקודתיים), co w języku hebrajskim oznacza „podwójny dwukropek”.

Nazwa „Paamayim Nekudotayim” została wprowadzona w opracowanym w Izraelu Zend Engine 0.5 używanym w PHP 3. Chociaż jest myląca dla wielu programistów, którzy nie mówią po hebrajsku, nadal jest używana w PHP 5, jak w tym przykładowym komunikacie o błędzie :

$ php -r :: Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM

Począwszy od PHP 5.4, komunikaty o błędach dotyczące operatora rozdzielczości zakresu nadal zawierają tę nazwę, ale nieco wyjaśniono jej znaczenie:

$ php -r :: Błąd analizy: błąd składni, nieoczekiwany „::” (T_PAAMAYIM_NEKUDOTAYIM)

Z oficjalnej dokumentacji PHP :

Operator rozdzielczości zakresu (zwany również Paamayim Nekudotayim) lub, mówiąc prościej, podwójny dwukropek, jest tokenem, który umożliwia dostęp do statycznych, stałych i przesłoniętych właściwości lub metod klasy.

Odwołując się do tych elementów spoza definicji klasy, użyj nazwy klasy.

Począwszy od PHP 5.3.0, możliwe jest odwołanie do klasy za pomocą zmiennej. Wartość zmiennej nie może być słowem kluczowym (np. Self, parent i static).

Paamayim Nekudotayim z początku wydawałby się dziwnym wyborem dla nazwania podwójnego dwukropka. Jednak pisząc Zend Engine 0.5 (który obsługuje PHP 3), zespół Zend postanowił to nazwać. W rzeczywistości oznacza to dwukropek - po hebrajsku!

John Slegers
źródło
1
To właściwie potoczny hebrajski. Wikipedia mówi teraz: „W PHP operator rozdzielczości zakresu jest również nazywany Paamayim Nekudotayim (hebr. פעמיים נקודותיים, wymawiane [paʔaˈmajim nəkudoˈtajim], drugie słowo potoczne zepsucie נקודתיים, wymawiane [nəkudaˈtajim col], co oznacza „Po hebrajsku”.
mic
11

Dzieje się tak również wtedy, gdy zastosujesz stałą w PHP do funkcji empty ():

if (!empty(SOME_CONSTANT)) {

}

To była moja sprawa. Rozwiązałem to za pomocą tego:

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

}
Max
źródło
2
Dlaczego stała byłaby pusta?
Nie panikuj
1
Ładne pytanie: to jest na przykład, jeśli ktoś jeszcze znalazł się w takiej sytuacji błędu, po prostu pokazuję, że będzie to również możliwe :)
Max
6
@ Don't Panic: Dlaczego nie? empty () sprawdza nie tylko, czy zmienna istnieje, ale także czy jej wartość jest „pusta” (w przypadku PHP zero (0) jest również puste). Taka stała może reprezentować wartość, która ma zostać zmieniona przez użytkownika - jak ustawienia DB lub niektóre wartości prawda / fałsz i inne typy wartości, których twórca kodu nie zna w czasie projektowania. Jest to typowe dla interfejsów API lub struktur kodu. Po prostu nie rozumiem, dlaczego twórcy parsera Zend nie użyli wspólnego słowa, które wszyscy znają i rozumieją, a zamiast tego niektórych słów hebrajskich. To znaczy, to wcale nie jest śmieszne.
StanE
Używam stałych w plikach konfiguracyjnych i chcę wiedzieć w kodzie, czy określona stała jest pusta (null, false, 0, pusty ciąg znaków, tablica emty ....). Czy powinienem przetestować je wszystkie ręcznie? WTF
qdev
5

Znam hebrajski całkiem dobrze, więc aby wyjaśnić wam nazwę „Paamayim Nekudotayim”, parafrazowane znaczenie to „podwójny dwukropek”, ale dosłownie przetłumaczone:

  • „Paamayim” oznacza „dwa” lub „dwa razy”
  • „Nekudotayim” oznacza „kropki” (lit. „dziury”)
    • W języku hebrajskim nekuda oznacza kropkę.
    • Liczba mnoga to nekudot , tzn. Kropki, które zachowują się jak samogłoski w języku angielskim.
    • Powodem, dla którego nazywa się to Nekudotayim, jest to, że sufiks „-ayim” oznacza również „dwa” lub „dwa razy”, ale zwykle oznacza dwa obiekty, a nie dwie akcje, a zatem ::oznacza „dwa razy, dwie kropki” lub więcej powszechnie znany jako operator rozdzielczości zakresu .
Sapphire_Brick
źródło
2

Może się to zdarzyć na Foreachach przy użyciu:

foreach( $array as $key = $value )

zamiast

foreach( $array as $key => $value )
GDY
źródło
1

Dla mnie stało się to w ramach funkcji klasy.

W PHP 5.3 i nowszych $this::$defaults działało dobrze; kiedy zamieniłem kod na serwer, który z jakiegokolwiek powodu miał niższy numer wersji, zgłosił ten błąd.

W moim przypadku rozwiązaniem było użycie słowa kluczowego selfzamiast $this:

self::$defaults działa dobrze.

bozdoz
źródło
Czy on zapytał o to $this, co się z tobą stało ?
Sapphire_Brick