PHP ожидает T_PAAMAYIM_NEKUDOTAYIM?

543

У кого-нибудь есть T_PAAMAYIM_NEKUDOTAYIM?

Питер Тернер
источник
22
Иногда это способ PHP сказать вам, что вы пропускаете знак $ ... например, если вы пишете _SESSION ["foo"] вместо $ _SESSION ["foo"]
Gonzo
131
иврит для двойного двойного двоеточия, но ... см. bugs.php.net/bug.php?id=14492 : "Кстати, в ошибке синтаксического анализа есть орфографическая ошибка, это должно быть T_PAAMAYIM_NEKUDATAYIM (на иврите" double " форма - это просто оригинальное существительное + суффикс «айим», а «некуда» - это единственная форма [«некудот» - форма множественного числа]). "
Вольфганг Фахл
66
@WolfgangFahl Я знал, что что-то об этой ошибке казалось неправильным.
Питер Тернер
14
@WolfgangFahl орфографическая ошибка только отсутствует u. Так и должно быть T_PAAMAYIM_NEKUDOTAYIM. ( PAAMAYIM= "дважды", NEKUDOTAYIM= := "נקודותיים")
Том
15
Когда я увидел эту ошибку, я просто ошеломленно смотрел на экран в течение 30 секунд, затем рассмеялся и пошел курить сигарету: F 1+
n00b

Ответы:

343

Это оператор двойного двоеточия ::(см. Список токенов парсера ).

гумбо
источник
11
На самом деле, нет. Проверьте этоvar_dump(empty(TRUE))
machineaddict
1
@machineaddict Неправильный вопрос / ответ?
Гамбо
2
Нет. Я только что добавил оценку, которая возвращает тот же T_PAAMAYIM_NEKUDOTAYIM. Я нашел это по ошибке.
Machineaddict
6
@Web_Developer, причина, по которой это происходит, заключается в том, что если у вас есть foreach($cats as catединственный приемлемый символ после catсинтаксически допустимого оператора - a ::, так как это позволит вам указать статическое свойство некоторого вызываемого класса cat. Например, если у catкласса есть открытый статический член с именем $mouse, тогда foreach($cats as cat::$mouse)он совершенно допустим php, но оператор с чем-либо, кроме ::после, catбудет синтаксической ошибкой. Если бы вы $mouseне были объявлены как свойство, catвы получили бы фатальную ошибку, но все же не синтаксическую ошибку.
chiliNUT
2
var_dump (empty (TRUE)), просто верните bool (false) в PHP 7.2
Программист Dancuk
109

Google творит чудеса.

Это иврит для "двойного двоеточия".

patricksweeney
источник
3
@MattiVirkkunen, а как насчет нового языка, который принимает любую ошибку, фиксирует, синтаксис на любом языке? :) Мы можем сделать это.
Гектор
2
Гугл привел меня сюда.
Sumit
2
израильтяне написали php :)
sd1sd1
@ sd1sd1, да, это, вероятно, Зеев написал это
peterchaula
53

Это имя для ::оператора в PHP. Это буквально означает «двойное двоеточие». Почему-то они назвали это на иврите. Проверьте синтаксис вашего кода и вставьте, ::где это уместно :-)

Илья Бирман
источник
1
Функции на английском, но эта ошибка на иврите. Я не уверен, есть ли другие ошибки на иврите, хотя.
Алекс
19
Выделите строку להדגיש מחרוזת. Отныне я, конечно, буду использовать свою собственную функцию array_push לדחוף_מערך в иврите. Я уверен, что всем моим коллегам, не говорящим на иврите, это понравится. Почти вся наша команда разработчиков говорит по крайней мере на одном языке, написанном нелатинскими символами. Должно быть весело :)
Исаак
3
Причина, по которой он написан на иврите, заключается в том, что код был написан израильтянами. Я не думаю, что они пропустили эту ошибку, они оставили ее непереведенной в качестве напоминания.
Рауль
5
@Raul Хорошо, так что в моем следующем проекте я напишу код ошибки на итальянском, я итальянский! Что вы ожидаете, английский везде? :-)
Джанлука Геттини
@ Илья Бирман Это буквально не означает "двойное двоеточие"; буквально означает «два раза, двойные точки»
Sapphire_Brick
47

Из Википедии :

В PHP оператор разрешения контекста также называется Paamayim Nekudotayim (иврит: פעמיים נקודתיים), что означает «двойное двоеточие» на иврите.

Название «Paamayim Nekudotayim» было введено в разработанном Израилем Zend Engine 0.5, используемом в PHP 3. Хотя это сбивает с толку многих разработчиков, которые не говорят на иврите, оно все еще используется в PHP 5, как в этом примере сообщения об ошибке. :

$ php -r :: Ошибка разбора: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM

Начиная с PHP 5.4, сообщения об ошибках, касающиеся оператора разрешения области действия, все еще включают это имя, но несколько разъяснили его значение:

$ php -r :: Ошибка разбора: синтаксическая ошибка, неожиданное '::' (T_PAAMAYIM_NEKUDOTAYIM)

Из официальной документации PHP :

Оператор разрешения области (также называемый Paamayim Nekudotayim) или, проще говоря, двойное двоеточие, является токеном, который обеспечивает доступ к статическим, постоянным и переопределенным свойствам или методам класса.

При ссылках на эти элементы вне определения класса используйте имя класса.

Начиная с PHP 5.3.0, можно ссылаться на класс с помощью переменной. Значение переменной не может быть ключевым словом (например, self, parent и static).

На первый взгляд Paamayim Nekudotayim может показаться странным выбором для обозначения двойной двоеточия. Тем не менее, во время написания Zend Engine 0.5 (который поддерживает PHP 3), именно так Zend и решили назвать его. Это на самом деле означает двойное двоеточие - на иврите!

Джон Слегерс
источник
1
Это на самом деле разговорный иврит. Википедия теперь говорит: «В PHP оператор разрешения области видимости также называется Paamayim Nekudotayim (иврит: פעמיים נקודותיים, произносится как [paʔaˈmajim nəkudoˈtajim], второе слово - разговорное искажение נקודתיים, произносится как« nimkuda ») ”На иврите."
микрофонный
11

Это также происходит, когда вы применяете константу в PHP к функции empty ():

if (!empty(SOME_CONSTANT)) {

}

Это был мой случай. Я решил это с помощью этого:

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

}
Максимум
источник
2
Почему константа будет пустой?
Не паникуйте
1
Хороший вопрос: это только для примера, если кто-то еще попал в эту ситуацию с ошибкой, я просто показываю, что это также будет возможно :)
Макс
6
@ Не паникуйте: почему бы и нет? empty () не только проверяет, существует ли переменная, но также и является ли ее значение «пустым» (в случае PHP ноль (0) также пуст). Такая константа может представлять значение, которое должно быть изменено пользовательскими настройками БД или некоторыми значениями true / false и другими типами значений, которые разработчик кода не знает во время разработки. Это распространено для API или структур кода. Я просто не понимаю, почему разработчики парсера Zend не использовали общее слово, которое все знают и понимают, а вместо этого некоторые еврейские слова. Я имею в виду, это даже не очень смешно.
Стан
Я использую константы в конфигурационных файлах, и я хочу знать в коде, является ли конкретная константа пустой (ноль, ложь, 0, пустая строка, массив emty ....). Должен ли я проверить их всех вручную? WTF
qdev
6

Я очень хорошо знаю иврит, поэтому, чтобы уточнить для вас имя «Paamayim Nekudotayim», перефразированное значение «двойной двоеточие», но переводится буквально:

  • «Паамаим» означает «два» или «дважды»
  • «Некудотаим» означает «точки» (букв. «Дыры»)
    • На иврите некуда означает точку.
    • Множественное число - это некудот , то есть точки, которые действуют как гласные на английском языке.
    • Причина, по которой он называется Некудотаим, заключается в том, что суффикс «-айим» также означает «два» или «дважды», но обычно он означает два объекта, а не два действия, поэтому он ::означает «два раза, две точки» или более широко известный как оператор разрешения области .
Sapphire_Brick
источник
2

Это может произойти на foreachs при использовании:

foreach( $array as $key = $value )

вместо

foreach( $array as $key => $value )
гды
источник
1

Для меня это произошло внутри функции класса.

В PHP 5.3 и выше $this::$defaultsработал нормально; когда я поменял код на сервер, который по какой-либо причине имел меньший номер версии, он выдал эту ошибку.

Решение, в моем случае, заключалось в использовании ключевого слова selfвместо $this:

self::$defaults работает просто отлично.

bozdoz
источник
Он спросить о $this, или что случилось с вами ?
Sapphire_Brick