【问题标题】:Can I use PHP reserved names for my functions and classes?我可以为我的函数和类使用 PHP 保留名称吗?
【发布时间】:2011-07-14 23:39:54
【问题描述】:

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

我可以在 PHP 中做到这一点吗?

【问题讨论】:

  • 你为什么要迷惑自己?
  • 帮自己一个忙,不要这样做。
  • 我想这样做是因为我正在做一个律师网站,我想有一些名为“case”的模型,其中有一个函数“new”,它将创建一个新案例
  • 不,现在为什么要分配这样的名称而不是更合理的函数和类名称?
  • 好吧好吧..我明白了..我不能:)

标签: php class function reserved


【解决方案1】:

Noyoucan't。感谢上帝。

【讨论】:

  • 它可能非常有用,例如查看 rails 控制器
  • @Alexcp:如果您的目标是破坏您的代码库,混淆每个人的语法高亮显示并让您的开发人员发疯,这可能会非常有用。
  • @Josef:听到这个消息我感到非常抱歉。
  • @LightnessRacesinOrbit:为什么?我的 URL 看起来不错,其他程序员应该很容易看到 URL 和方法之间的相关性,而无需查看路由规则。
  • @JosefOttosson:因为我已经说过关于使用保留关键字作为函数名的一切。这只是邪恶的。您的解决方法是不必要且混乱的!
【解决方案2】:

实际上,虽然定义这样的方法会导致解析错误,但使用它不会,这允许某种变通方法:

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

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

可追溯到 2004 年的相关 feature request 仍然开放。

2016 年 1 月编辑

从 PHP 7 开始,现在可以使用迄今为止受到限制的关键字来命名您的方法,这要归功于 Context Sensitive Lexer:

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

但是,恐怕您仍然不能将您的班级命名为 Case

【讨论】:

  • 我们都知道文档当前 说了什么,但是讨论总是在进行,并不是所有人都像你一样在这个问题上那么凶猛。事实是,目前在使用保留关键字定义方法时引发解析错误与使用此方法名称不会引发任何错误之间存在很大的不一致。因此,这种保留关键字的使用在未来很可能会被允许,因为从解析器的角度来看,使用它们的上下文使它们与它们的原始含义区分开来。
  • cellog@php.net 甚至提供了一个补丁作为概念证明(参见我的答案中的链接),并就当前行为有时可能存在问题的原因进行了论证:“作为新保留引入单词时,它们往往会与现有类的方法名称发生冲突”。我并不是说这是要走的路,但我确实认为保持开放的心态是件好事。
  • 是的,它们将来可能会被允许。同样,它们将来可能永远不会被允许。这可能会成为将来的解析错误。 “保持开放的心态”涉及为两种场景做好准备,这意味着尽你所能遵循语言的指示。
【解决方案3】:

你不能这样做,另一种选择是只使用 _case() 或 _new() 作为函数名

也可以看看:

Is it possible to "escape" a method name in PHP, to be able to have a method name that clashes with a reserved keyword?

【讨论】:

    【解决方案4】:

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

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

    也许你可以重新编译 PHP 或类似的东西来实现你的目标,但我认为(作为其他回答你的人)这不是一个好主意 :)

    HTH!

    【讨论】:

      【解决方案5】:

      按照 Benjamin 提到的内容,在 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);
          }
      }
      

      【讨论】:

        【解决方案6】:

        我刚刚重命名了课程来解决我的问题。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-27
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多