PHP 需要T_PAAMAYIM_NEKUDOTAYIM?

PHP expects T_PAAMAYIM_NEKUDOTAYIM?

提问人:Peter Turner 提问时间:2/27/2009 最后编辑:John SlegersPeter Turner 更新时间:4/12/2022 访问量:189545

问:

有人有吗?T_PAAMAYIM_NEKUDOTAYIM

php 运行时 语法错误 错误代码

评论

26赞 Gonzo 1/10/2012
有时这是PHP告诉你你缺少$符号的方式......例如,如果您编写 _SESSION[“foo”] 而不是 $_SESSION[“foo”]
0赞 Manngo 10/21/2016
我知道这是一个老问题,但简短的回答是 PHP (错误地)将常量解释为类名。某些操作(如 )不会计算包含常量的表达式。因此,他们将尝试将常量解释为类名,并期望它具有指示静态属性的 a。当然,如果你忘记了一个变量,它就会被误解为一个常量。如果不是错误消息,这种疯狂的大部分内容在以后的PHP版本中都得到了修复。empty::$

答:

385赞 Gumbo 2/27/2009 #1

它是双冒号运算符 :: (请参阅解析器标记列表)。

评论

11赞 machineaddict 6/5/2014
没有。测试一下var_dump(empty(TRUE))
3赞 machineaddict 6/11/2014
不。我刚刚添加了一个返回相同T_PAAMAYIM_NEKUDOTAYIM的评估。我误打误撞地找到了它。
0赞 Web_Developer 7/9/2015
它显示变量中缺少 $ 的时间。我今天得到了它并到达了这个帖子。在 foreach($cats as cat) 中,然后在下一行中使用相同的 cat 显示错误。但是答案是::这个人接受了它......??
9赞 chiliNUT 1/21/2016
@Web_Developer,发生这种情况的原因是,如果语法上有效的语句后面有一个唯一可接受的字符是 ,因为它允许您指定某个类的静态属性。例如,如果类有一个名为 的公共静态成员,则是完全有效的,但是带有 之后的任何内容的语句将是语法错误。如果不是声明的属性,您将收到致命错误,但仍然不是语法错误。foreach($cats as catcat::catcat$mouseforeach($cats as cat::$mouse)php::cat$mousecat
5赞 Programmer Dancuk 10/6/2018
var_dump(empty(TRUE)) ,只需在 PHP 7.2 中返回 bool(false)
147赞 patricksweeney 2/27/2009 #2

希伯来语中是“双冒号”的意思。

评论

94赞 Matti Virkkunen 2/16/2015
PHP - 唯一一种只能用希伯来语添加错误消息并且人们接受您的提交的语言。
34赞 dotancohen 2/27/2022
@MattiVirkkunen P erplexing Hebrew Parser.
1赞 Colandus 3/6/2023
我不认为他们需要任何人批准他们的提交(:
65赞 Ilya Birman 2/27/2009 #3

它是 PHP 中运算符的名称。它的字面意思是“双冒号”。出于某种原因,他们用希伯来语命名它。检查您的代码语法,并在适当的位置放置一个 :-)::::

评论

1赞 alex 3/1/2009
函数是英文的,但该错误是希伯来语的。我不确定希伯来语中是否有任何其他错误。
31赞 Isaac 11/22/2013
突出显示字符串是 להדגיש מחרוזת。当然,从现在开始,我将只使用希伯来字符的自定义array_push函数 לדחוף_מערך。我相信我所有不会说希伯来语的同事都会喜欢它。我们几乎所有的开发团队都至少会说一种用非拉丁字符编写的语言。应该很有趣:)
1赞 Sapphire_Brick 12/10/2019
@Ilya Birman 它的字面意思不是“双冒号”;它的字面意思是“两次,双点”
0赞 Sandwich 6/23/2022
@Sapphire_Brick嗯,是的,但实际上不是。;)希伯来语中“冒号”(字符,而不是器官)的单词是“nekudotayim”,字面意思是“双点”。因此,将希伯来语翻译为“双双点”或“双冒号”是 100% 正确的。
57赞 John Slegers 3/14/2014 #4

来自维基百科

在 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 和静态)。

起初,Paamayim Nekudotayim 似乎是一个奇怪的选择 命名双冒号。但是,在编写 Zend Engine 0.5 时 (它为 PHP 3 提供支持),这就是 Zend 团队决定的称呼。它 实际上确实意味着双冒号 - 在希伯来语中!

评论

2赞 mic 8/8/2019
它实际上是口语化的希伯来语。维基百科现在说:“在PHP中,范围解析运算符也被称为Paamayim Nekudotayim(希伯来语:פעמייםנקודותיים,发音为[paʔaˈmajim nəkudoˈtajim],第二个词是נקודתיים的口语化腐败,发音为[nəkudaˈtajim]),在希伯来语中意为”双冒号”。
14赞 Harman 11/22/2014 #5

当您将 PHP 中的常量应用于 empty() 函数时,也会出现这种情况:

if (!empty(SOME_CONSTANT)) {

}

我就是这种情况。我用这个解决了它:

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

}

评论

2赞 Don't Panic 11/22/2014
为什么常量是空的?
1赞 Harman 11/22/2014
好问题:这只是例如,如果其他人遇到这种错误情况,我只是表明它也可能:)
7赞 StanE 3/6/2015
@Don不恐慌:为什么不呢?empty() 不仅测试变量是否存在,还测试它的值是否为“空”(在 PHP 中,零 (0) 也是空的)。这样的常量可以表示用户要更改的值 - 例如数据库设置或一些 true/false 值以及代码开发人员在设计时不知道的其他值类型。这在 API 或代码框架中很常见。我只是不明白为什么 Zend 解析器的开发人员没有使用每个人都知道和理解的常用词,而是使用一些希伯来语词。我的意思是,这甚至不是很有趣的。
1赞 qdev 4/26/2019
我在配置文件中使用常量,我想在代码中知道特定常量是否为空(null、false、0、空字符串、emty 数组......我应该手动测试所有这些吗?跆拳道
2赞 bozdoz 7/12/2016 #6

对我来说,这发生在类函数中。

在 PHP 5.3 及更高版本中工作正常;当我将代码交换到服务器时,无论出于何种原因,该服务器的版本号较低,它都会抛出此错误。$this::$defaults

就我而言,解决方案是使用关键字而不是:self$this

self::$defaults工作得很好。

4赞 GDY 10/8/2018 #7

当使用以下方法时,这可能会发生在 foreachs 上:

foreach( $array as $key = $value )

而不是

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

评论

0赞 MAChitgarha 1/19/2023
这仅在 PHP 7.0 中发生,从 PHP 8.0 开始不再如此:3v4l.org/HScA4
25赞 Sapphire_Brick 12/10/2019 #8

我非常了解希伯来语,所以为了为您澄清“Paamayim Nekudotayim”这个名字,释义的意思是“双冒号”,但从字面上翻译:

  • “Paamayim”的意思是“两个”或“两次”
  • “Nekudotayim”的意思是“点”(点亮“洞”)
    • 在希伯来语中,nekuda 的意思是一个点。
    • 复数形式是nekudot,即点,用作元音
    • 之所以称它为Nekudo-tayim,是因为后缀“-ayim”也有“两个”或“两个”的意思,因此表示“两次,两个点”,或者更常称为范围解析运算符::

评论

1赞 Michael Haddad 5/9/2021
“像英语中的元音一样的点”是什么意思?这里的“Nekudot”表示冒号(:)是复合的两个点。你指的是 Niqqud 吗?这个概念并不相关,即使这两个词具有相同的词根。
1赞 Michael Haddad 5/9/2021
此外,“-ayim”后缀表示两次,“Paam”表示时间。所以“Paamayim”的意思是两两次“Nekuda”是一个点,“Nekudot”是“Nekuda”的复数形式——很多点。在这里,“-ayim”后缀的意思是“两次”。所以我们得到:两次多次点两次 - 没有多大意义......原因是“Nekudotaym”实际上是这个词的拼写和发音错误。这是PHP开发人员犯的一个错误。它应该是“Nekudatayim”——意思是,两个“Nekuda”两个点。所以它实际上意味着:两个点,这更有意义。
0赞 Sapphire_Brick 5/10/2021
@Sipo我试图避免解释技术细节。Nekudot (נקודות) 是元音。关于您的第二点,单词中的拼写错误是错误消息的另一个不相关的问题。
0赞 Sapphire_Brick 5/11/2021
@Sipo 为什么不呢?你的意思是尽管存在歧义的风险,但可以省略 nekudot 这一事实吗?
0赞 Michael Haddad 5/11/2021
不。我的意思是希伯来语中的元音还有另一个名字:Tnu'ot,它们在视觉上由称为 Niqqud 的图形符号表示,而不是 Nekudot。虽然这两个词都来自Nekuda,但它们并不相同。双冒号与元音无关。
6赞 MAChitgarha 6/26/2020 #9

编辑:不幸的是,从 PHP 8.0 开始,答案不是“不,不再”。这个RFC没有像我希望的那样被接受,建议改成;但它被拒绝了。T_PAAMAYIM_NEKUDOTAYIMT_DOUBLE_COLON

注意:出于历史目的,我保留此答案。实际上,由于 RFC 的创建和某个时候的投票率,我创建了这个答案。另外,我保留这个是希望它在不久的将来被接受。

1赞 Mark Cicchetti 9/25/2020 #10

这刚刚发生在我使用双引号的字符串赋值中。我在 POST 变量上缺少一个结束大曲......

"for {$_POST['txtName'] on $date";

本来应该是

"for {$_POST['txtName']} on $date";

我无法解释为什么。我的意思是,我看到了会破坏代码的错误,但我不明白为什么它引用了类错误。

-1赞 Thomas Murphy 12/9/2020 #11

这刚刚发生在我身上的 foreach 循环中。我无意中打字,PHP反对第一个.($array as $key as $value)as