我能使用PHP保留名称作为我的函数和类吗?

13

我想创建一个名为 "new" 的函数和一个名为 "case" 的类。

我可以在PHP中实现吗?


5
你为什么想要让自己困惑? - BoltClock
3
给自己一个好处,不要这样做。 - Pekka
1
我想这样做是因为我正在制作一个律师网站,我想要一些名为“案例”的模型,并在其中添加一个名为“新建”的函数,用于创建新的案例。 - Ciprian Mocanu
2
不,现在为什么要给它们分配这样的名称,而不是更合理的函数和类名称呢? - Mark Baker
2
好的好的,我明白了,我做不到 :) - Ciprian Mocanu
显示剩余2条评论
6个回答

31

2
它可能非常有用,例如查看Rails控制器。 - Alexcp
4
如果你的目标是搞乱你的代码库、让所有人的语法高亮变得混乱并使你的同事开心疯掉,那么这可能非常有用。 - Lightness Races in Orbit
1
@Josef:听到这个消息我感到非常难过。 - Lightness Races in Orbit
1
@LightnessRacesinOrbit:为什么?我的URL看起来很好,另一个程序员应该能够轻松地看到URL和方法之间的关联,而不必查看路由规则。 - Josef Engelfrost
1
@JosefOttosson:因为我已经说过的关于使用保留关键字作为函数名称的所有内容。这太邪恶了。你的解决方法是不必要和混乱的! - Lightness Races in Orbit
显示剩余2条评论

30

实际上,虽然定义这样的方法会导致解析错误,但使用它并不会,这使得一些变通方法成为可能:

class A {
    function __call($method, $args) {
        if ($method == 'new') {
            // ...
        }
    }
}

$a = new A;
$a->new(); // works!

有一个相关的功能请求追溯自2004年,至今仍然未被关闭。

2016年1月编辑

从PHP 7开始,现在可以使用之前受限制的关键词来命名你的方法了,多亏了上下文敏感的词法分析器

class Foo {
    public function new() {}
    public function list() {}
    public function foreach() {}
}

很抱歉,您仍然不能将您的类命名为Case


2
我们都知道文档目前的内容,但是讨论总是存在的,并不是所有人在这个问题上像你一样激烈。事实上,当使用保留关键字作为方法名时不会引发任何错误,而定义一个带有保留关键字的方法却会引发解析错误,这种情况目前存在相当大的不一致性。因此,从解析器的角度来看,这种保留关键字的使用方式可能在未来被允许,因为它们所处的上下文使它们与原始含义有所区别。 - BenMorel
cellog@php.net 甚至提供了一个证明概念的补丁(请参阅我的回答中的链接),并给出了为什么当前行为有时会有问题的论据:“随着引入新的保留字,它们往往会与现有类的方法名冲突。” 我不是说这是正确的方式,但我认为保持开放的思路是好的。 - BenMorel
是的,它们可能会在未来被允许。同样,它们也可能永远不会在未来被允许。这在未来可能会成为解析错误。 “保持开放的心态”意味着要为两种情况做好准备,这意味着尽力遵循语言的规定。 - Lightness Races in Orbit

2

1

默认情况下是不可能的,它们是保留字,你不能使用它们。

http://www.php.net/manual/en/reserved.keywords.php

也许你可以重新编译PHP或类似的东西来实现你的目标,但我认为(就像其他回答你的人一样)这不是一个好主意 :)
希望对你有所帮助!

0
沿着Benjamin提到的方向,这里有一个有趣的使用"clone"(保留字)的例子,在class中的第545行。
 public function __call($method, $args)
{
    if ('clone' == $method) {
        return call_user_func_array(array($this, 'cloneRepository'), $args);
    } else {
        $class = get_called_class();
        $message = "Call to undefined method $class::$method()";
        throw new \BadMethodCallException($message);
    }
}

0

我只是将类名更改以解决我的问题。

foreach($array as $key => $line){
    if($key == "resource"){
        $key = "resources";
        $array->$key = $line;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接