这是什么意思?"解析错误:语法错误,意外T_PAAMAYIM_NEKUDOTAYIM"

ope*_*rog 58 php

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();
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

在构造函数中,我创建了一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ben*_*ley 68

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

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

return $cnf::getConfig($key);
Run Code Online (Sandbox Code Playgroud)

应该

return $cnf->getConfig($key);
Run Code Online (Sandbox Code Playgroud)

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

  • @Pascal,如果整套错误信息都是希伯来语,我会很高兴(尽管PHP的使用会有所减少).但鉴于它是一个希伯来语短语,否则它是一个英语信息,它是不合适的 - 用"双冒号"或其他不需要查找晦涩的短语的其他东西取代它需要多少努力.试想一下,世界各地的代码切割者不得不查看这个短语浪费了多少累积时间.在学习新环境而不抛弃人工环境时,有足够的障碍. (27认同)
  • 来自维基百科:"在PHP中,范围解析运算符也称为Paamayim Nekudotayim(希伯来语:פעמייםנקודתיים,发音为[paʔamajimnəkudotajim]),意思是希伯来语中的"两次冒号"或"双冒号"" - >面对这样的事实: 99.9%的开发者不会说希伯来语,我必须承诺:我喜欢Objective-C.现在我知道为什么了. (17认同)
  • 这是希伯来语 - 因为Zend Engine最初是由来自以色列的Andi Gutmans和Zeev Suraski开发的(见http://en.wikipedia.org/wiki/Zend_Engine) (13认同)
  • @openfrog&@ paxdiablo:你可以花几周/几个月/几年学习编程,算法和新的编程语言,但是当你在PHP中看到"新/特殊"的东西时却不行吗?来吧,您需要多长时间才能了解哪些类,接口,继承以及所有这些?这两个"paamayim nekudotayim"的话有多长?我不是说那些不是"奇怪的",但它也不是这样的灾难,是吗? (11认同)
  • 此外,我必须学习的算法,语言特性等等,实际上在其应用的直接领域之外是有用的.由于我不太可能在PHP之外需要希伯来语双重冒号,这是一个相当有限的教育.甚至不得不提出这个问题的事实证明了希伯来语片段是一个坏主意. (6认同)
  • 好吧,至少,一旦你得到这个错误,你就会记住它意味着什么;-) ;; 我不认为理解这个的含义比理解?:运算符是如何工作的更难(例如 - 记住,它的行为已经被PHP 5.3改变了;-));; 但我明白你的观点. (4认同)

tom*_*fen 11

对于有这个问题的未来访客来说,这只是我的两分钱.

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

MyClassName::getConfig($key);
Run Code Online (Sandbox Code Playgroud)

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

$cnf = MyClassName;
$cnf::getConfig($key);
Run Code Online (Sandbox Code Playgroud)

但是,这个sintax在PHP 5.2或更低版本上不起作用,您需要使用以下内容:

$cnf = MyClassName;
call_user_func(array($cnf, "getConfig", $key, ...otherposibleadditionalparameters... ));
Run Code Online (Sandbox Code Playgroud)

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