这是什么意思? “parsing错误:语法错误,意外的T_PAAMAYIM_NEKUDOTAYIM”

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(); } } ?> 

在构造函数中,我创build了一个Config对象。 这是这个class级:

 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; } } 

不知道为什么这不起作用/错误的意思是…

T_PAAMAYIM_NEKUDOTAYIM是PHP使用的双冒号作用域分辨率 – ::

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

 return $cnf::getConfig($key); 

应该

 return $cnf->getConfig($key); 

第一种是静态调用方法 – 如果$ cnf包含一个也是有效类的string,则该代码将是有效的。 – >语法用于在类/对象的实例上调用方法。

只有我的两分钱给未来的游客谁有这个问题。

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

 MyClassName::getConfig($key); 

如果您以前将ClassName分配给$ cnfvariables,则可以从中调用静态方法(我们正在讨论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的版本)。

在你的例子中

 return $cnf::getConfig($key) 

可能应该是:

 return $cnf->getConfig($key) 

并使getConfig不是静态的

该错误归结为双冒号操作符的“不适当使用”:

 return $cnf::getConfig($key); 

通过使用::你试图调用类本身的静态方法。 在你的例子中,你想调用一个实例化对象的非静态方法。

我想你想要的是:

 return $cnf->getConfig($key); 

根据维基百科,这意味着一个“双冒号”范围parsing运算符。

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

这是::运算符的名称

维基百科

如果你仍然需要使用双冒号,那么确保你的PHP 5.3+