【问题标题】:PHP expects T_PAAMAYIM_NEKUDOTAYIM?PHP 期望 T_PAAMAYIM_NEKUDOTAYIM?
【发布时间】:2010-10-10 04:34:10
【问题描述】:

有人有T_PAAMAYIM_NEKUDOTAYIM吗?

【问题讨论】:

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

标签: php syntax-error runtime-error


【解决方案1】:

它是双冒号运算符::(参见list of parser tokens)。

【讨论】:

  • 并非如此。测试这个var_dump(empty(TRUE))
  • 没有。我刚刚添加了一个返回相同 T_PAAMAYIM_NEKUDOTAYIM 的评估。我误会了。
  • 它显示变量中缺少 $ 的时间。我今天得到它并到达了这个帖子。在 foreach($cats as cat) 然后在下一行使用相同的 cat 显示错误。但是答案是关于 :: 并且该人接受了它....??
  • @Web_Developer,发生这种情况的原因是,如果您有一个 foreach($cats as cat,那么对于语法上有效的语句,cat 之后唯一可接受的字符是 ::,因为它允许您指定某个名为cat 的类的静态属性。例如,如果cat 类有一个名为$mouse 的公共静态成员,那么foreach($cats as cat::$mouse) 是完全有效的php,但是在:: 之后的:: 之外的任何语句将是语法错误。如果$mouse 不是cat 的声明属性,您将收到致命错误,但仍然不是语法错误。
  • var_dump(empty(TRUE)) ,在 PHP 7.2 中只返回 bool(false)
【解决方案2】:

Hebrew 表示“双冒号”。

【讨论】:

  • PHP - 唯一一种您可以仅在希伯来语中添加错误消息并且人们接受您的提交的语言。
【解决方案3】:

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

【讨论】:

  • 函数是英文的,但那个错误是希伯来语的。不过,我不确定希伯来语中是否还有其他错误。
  • 高亮字符串是 להדגיש מחרוזת。从现在开始,我当然只会在希伯来语字符中使用我的自定义 array_push 函数 לדחוף_מערך。我相信我所有不会说希伯来语的同事都会喜欢它。几乎我们所有的开发团队都会说至少一种用非拉丁字符书写的语言。应该很有趣:)
  • @Ilya Birman 它的字面意思不是“双冒号”;它的字面意思是“两次,双点”
【解决方案4】:

来自Wikipedia

在 PHP 中,作用域解析运算符也称为 Paamayim Nekudotayim(希伯来语:פעמיים נקודתיים‎),意思是“双冒号” 希伯来语。

“Paamayim Nekudotayim”这个名字是在 以色列开发的 Zend Engine 0.5 用于 PHP 3。虽然它已经 让许多不会说希伯来语的开发人员感到困惑,它仍然是 在 PHP 5 中使用,如此示例错误消息中所示:

$ php -r :: Parse error: 语法错误,意外 T_PAAMAYIM_NEKUDOTAYIM

从 PHP 5.4 开始,有关范围解析运算符的错误消息 仍然包括这个名字,但已经稍微澄清了它的含义:

$ php -r :: Parse error: 语法错误,意外'::' (T_PAAMAYIM_NEKUDOTAYIM)

来自the official PHP documentation

范围解析运算符(也称为 Paamayim Nekudotaim)或在 更简单的术语,双冒号,是一个允许访问 类的静态、常量和重写属性或方法。

当从类定义之外引用这些项目时,使用 类的名称。

从 PHP 5.3.0 开始,可以使用 多变的。变量的值不能是关键字(例如 self、parent 和静态)。

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

【讨论】:

  • 它实际上是通俗的希伯来语。维基百科现在说:“在 PHP 中,范围解析运算符也称为 Paamayim Nekudotayim(希伯来语:פעמיים נקודותיים‎,发音为 [paʔaˈmajim nəkudoˈtajim],第二个词是 נקודתיים,发音为 [nəkudaˈtajim]),意思是”在希伯来语中。”
【解决方案5】:

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

if (!empty(SOME_CONSTANT)) {

}

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

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

}

【讨论】:

  • 为什么常量会是空的?
  • 好问题:这只是例如,如果其他人遇到这种错误情况,我只是表明它也是可能的:)
  • @Don't Panic:为什么不呢? empty() 不仅测试变量是否存在,还测试它的值是否为“空”(在 PHP 的情况下,零 (0) 也是空的)。这样的常量可以表示一个打算由用户更改的值 - 例如数据库设置或一些真/假值以及代码开发人员在设计时不知道的其他值类型。这对于 API 或代码框架很常见。我只是不明白为什么 Zend 解析器的开发人员没有使用每个人都知道和理解的常用词,而是使用一些希伯来语词。我的意思是,这甚至都不是很有趣。
  • 我在配置文件中使用常量,我想在代码中知道特定常量是否为空(null、false、0、空字符串、空数组......)。我应该手动测试所有这些吗?见鬼
【解决方案6】:

我很了解希伯来语,所以为了澄清一下“Paamayim Nekudotayim”这个名字,转述的意思是“双冒号”,但直译为:

  • “Paamayim”的意思是“两个”或“两次”
  • “Nekudotayim”的意思是“点”(字面意思是“孔”)
    • 在希伯来语中,nekuda 表示一个点。
    • 复数形式是nekudot,即点,起到元音的作用
    • 之所以叫Nekudo-tayim是因为后缀“-ayim”也表示“二”或“两次”,因此::表示“两次,两个点”,或更常见的称为Scope Resolution Operator

【讨论】:

  • “在英语中表现得像元音的点”是什么意思?这里的“Nekudot”代表冒号 (:) 是两个点的组合。你指的是Niqqud吗?这个概念是不相关的,即使两个词有相同的词根。
  • 另外,“-ayim”后缀表示两次,“Paam”表示时间。所以“Paamayim”的意思是两次两次。 “Nekuda”是一个点,而“Nekudot”是“Nekuda”的复数 - 许多点。再次,“-ayim”后缀的意思是“两次”。所以我们得到:Twice many dots two - 没有多大意义……原因是“Nekudotaym”实际上是错误这个词的拼写和发音。这是PHP开发人员犯的错误。它应该是“Nekudatayim” - 意思是,两次“Nekuda”两个点。所以它实际上意味着:两个点,这更有意义。
  • @Sipo 我试图避免解释技术细节。 Nekudot (נקודות) 是元音。关于您的第二点,单词中的错字是与错误消息无关的另一个问题。
  • @Sipo 为什么不呢?您的意思是 nekudot 可以省略,尽管存在模棱两可的风险?
  • 没有。我的意思是希伯来语中的元音有另一个名字:Tnu'ot,它们在视觉上被称为Niqqud的图形符号代替,而不是Nekudot。虽然这两个词都来自Nekuda,但它们并不相同。双冒号与元音无关。
【解决方案7】:

这可能在使用时发生在 foreachs 上:

foreach( $array as $key = $value )

而不是

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

【讨论】:

    【解决方案8】:

    编辑:不幸的是,从 PHP 8.0 开始,答案不是“不,不再是”。 This RFC没有如我所愿接受,建议将T_PAAMAYIM_NEKUDOTAYIM改为T_DOUBLE_COLON;但被拒绝了。

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

    【讨论】:

      【解决方案9】:

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

      在 PHP 5.3 及更高版本中 $this::$defaults 工作正常;当我将代码交换到由于某种原因具有较低版本号的服务器时,它会引发此错误。

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

      self::$defaults 工作正常。

      【讨论】:

        【解决方案10】:

        这只是在使用双引号的字符串赋值中发生在我身上。我错过了一个 POST 变量的结束卷曲...

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

        应该是

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

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

        【讨论】:

          【解决方案11】:

          这只是在 foreach 循环中发生在我身上。我无意中输入了($array as $key as $value),PHP 反对第一个as

          【讨论】:

            猜你喜欢
            • 2011-07-06
            • 1970-01-01
            • 2011-06-27
            • 2020-06-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多