【问题标题】:What does this mean? "Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM"这是什么意思? “解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM”
【发布时间】:2010-12-30 06:37:39
【问题描述】:

T_PAAMAYIM_NEKUDOTAYIM 听起来很异国情调,但对我来说绝对是一派胡言。我将其全部追溯到这行代码:

<?php
Class Context {
    protected $config;

    public function getConfig($key) { // Here's the problem somewhere...
    $cnf = $this->config;
    return $cnf::getConfig($key);
    }

    function __construct() {
    $this->config = new Config();
    }
}
?>

在构造函数中,我创建了一个 Config 对象。这是课程:

final class Config {
    private static $instance = NULL;
    private static $config;

    public static function getConfig($key) {
    return self::$config[$key];
    }

    public static function getInstance() {
    if (!self::$instance) {
        self::$instance = new Config();
    }
    return self::$instance;
    }

    private function __construct() {
    // include configuration file
    include __ROOT_INCLUDE_PATH . '/sys/config/config.php'; // defines a $config array
    $this->config = $config;
    }
}

不知道为什么这不起作用/错误意味着什么......

【问题讨论】:

标签: php


【解决方案1】:

T_PAAMAYIM_NEKUDOTAYIM 是 PHP 使用的双冒号范围解析 - ::

快速浏览一下你的代码,我认为这行:

return $cnf::getConfig($key);

应该是

return $cnf->getConfig($key);

第一种是静态调用方法的方式——如果 $cnf 包含一个也是有效类的字符串,则此代码将是有效的。 -> 语法用于在类/对象的实例上调用方法。

【讨论】:

  • 这是希伯来语 -- 因为 Zend 引擎最初是由来自以色列的 Andi Gutmans 和 Zeev Suraski 开发的(请参阅 en.wikipedia.org/wiki/Zend_Engine
  • 来自维基百科:“在 PHP 中,范围解析运算符也称为 Paamayim Nekudotayim(希伯来语:פעמיים נקודתיים‎,发音为 [paʔaˈmajim nəkudoˈtajim]),在希伯来语”-> 面对 99.9% 的开发者不会说希伯来语的事实,我必须承诺:我喜欢 Objective-C。现在我知道为什么了。
  • @openfrog & @paxdiablo : 你可以花几周/几个月/几年的时间学习编程、算法和新的编程语言,但是当你在 PHP 中看到“新/特别”的东西时就不行了?来吧,你花了多长时间才明白什么是类、接口、继承等等?两个“paamayim nekudotayim”字要多长时间?我不是说那些不“奇怪”,但这也不是什么灾难,不是吗?
  • @Pascal,如果整个错误消息集都是希伯来语,我会很高兴(尽管 PHP 的使用会有所减少)。但是鉴于它是一个希伯来语短语,否则它是一个英文信息,它不合适 - 用短语“双冒号”或其他不需要查找晦涩短语的东西替换它需要多少努力.试想一下,世界各地的代码切割者不得不查找该短语浪费了多少时间。学习一个新环境的路上有足够多的障碍,而不是在人工环境中折腾。
  • 此外,我必须学习的算法、语言特征等内容实际上在其直接应用领域之外也很有用。由于我不太可能需要 PHP 之外的双冒号的希伯来语短语,这是一个相当有限的教育。甚至不得不问这个问题的事实证明了希伯来语 sn-p 是一个坏主意。
【解决方案2】:

对于遇到此问题的未来访问者,只需我的两分钱。

这是 PHP 5.3 的正确语法,例如,如果您从类名调用静态方法:

MyClassName::getConfig($key);

如果您之前将 ClassName 分配给 $cnf 变量,则可以从中调用静态方法(我们谈论的是 PHP 5.3):

$cnf = MyClassName;
$cnf::getConfig($key);

但是,此 sintax 不适用于 PHP 5.2 或更低版本,您需要使用以下内容:

$cnf = MyClassName;
call_user_func(array($cnf, "getConfig", $key, ...otherposibleadditionalparameters... ));

希望这可以帮助人们在 5.2 版本中遇到此错误(不知道这是否是 openfrog 的版本)。

【讨论】:

    【解决方案3】:

    在你的例子中

    return $cnf::getConfig($key)
    

    应该是:

    return $cnf->getConfig($key)
    

    并使 getConfig 不是静态的

    【讨论】:

      【解决方案4】:

      如果您仍需要使用双冒号,请确保您使用的是 PHP 5.3+

      【讨论】:

      • 请注意tomasofen's answer 已经说过了。也许您想投票而不是发布自己的零散知识?
      【解决方案5】:

      错误归结为双冒号运算符的“不当使用”:

      return $cnf::getConfig($key);
      

      通过使用::,您正在尝试调用类本身的静态方法。在您的示例中,您想在实例化对象上调用非静态方法。

      我想你想要的是:

      return $cnf->getConfig($key);
      

      【讨论】:

      • @benlumley 上面的回答措辞更好:)
      【解决方案6】:

      根据维基百科,它表示“双冒号”范围解析运算符。

      http://en.wikipedia.org/wiki/Scope_resolution_operator

      【讨论】:

        【解决方案7】:

        这是:: 运算符的名称

        Wikipedia

        【讨论】:

          【解决方案8】:

          对于任何使用 Laravel 的人。我在 Laravel 7.0 上遇到了同样的错误。错误看起来像这样

          syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting ';' or ','
          

          它在我的 Routes\web.php 文件中,看起来像这样

          use Illuminate\Support\Facades\Route;
          use Illuminate\Http\Request;
          use // this was an extra **use** statement that gave me the error
          
          Route::get('/', function () {
              return view('save-online.index');
          })->name('save-online.index');
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-22
            • 2013-12-15
            • 2013-12-21
            • 2013-10-11
            • 2023-03-18
            • 2010-11-10
            • 2012-06-17
            相关资源
            最近更新 更多