在PHP5.3中是否可以使用new作为方法名?

在PHP5.3中是否可以使用new作为方法名?,php,namespaces,Php,Namespaces,我嫉妒Ruby使用“new”作为一种方法。在PHP5.3中使用名称空间可以实现这一点吗 class Foo { public function new() { echo 'Hello'; } } 如您所见,“new”在保留字列表中,因此您不能使用它来命名方法 不能将以下任何单词用作常量、类名、函数或方法名 这个问题的简短答案似乎是否定的,因为这是一个错误 在这样的课堂上有可用的单词是很好的,但是保留单词很重要,这是有原因的。人们倾向于使用其他同义

我嫉妒Ruby使用“new”作为一种方法。在PHP5.3中使用名称空间可以实现这一点吗

class Foo
{
     public function new()
     {
         echo 'Hello';
     }
}
如您所见,“new”在保留字列表中,因此您不能使用它来命名方法

不能将以下任何单词用作常量、类名、函数或方法名


这个问题的简短答案似乎是否定的,因为这是一个错误


在这样的课堂上有可用的单词是很好的,但是保留单词很重要,这是有原因的。人们倾向于使用其他同义词:create、new、getInstance()[通常是静态用法],等等。

不。正如其他地方已经指出的那样,
new
是一个保留关键字。尝试将其用作方法名称将导致分析错误:“语法错误,意外的
T_NEW
,应为
T_STRING
”。名称空间没有帮助,因为
new
关键字适用于任何名称空间。解决这个问题的唯一方法是使用虚拟方法,例如

/**
 * @method String new new($args) returns $args
 */
class Foo
{
     protected function _new($args)
     {
         return $args;
     }
     public function __call($method, $args)
     {
         if($method === 'new') {
             return call_user_func_array(array($this, '_new'), $args);
         } else {
             throw new LogicException('Unknown method');
         }
     }
}
$foo = new Foo;
echo $foo->new('hello'); // return hello
echo $foo->boo();        // throws Exception

但我不鼓励这样做。所有神奇的方法都比直接调用方法慢,如果简单的规则是可能没有方法名
new
,那么就这样吧。使用同义词。

是,从PHP7开始。但仅限于学员、接口和特性

现在允许在类、接口和特征中使用全局保留字作为属性、常量和方法名


--

谢谢你的推荐。不过我喜欢新的。啊。也许我会改用create。是的,“new”可以是类中的方法名。一个典型的用例是在symfony4中,“phpbin/console make:crud”将在控制器类中创建一个“新”方法。但有些IDE(如Netbeans)会报告语法错误。