方法名称与语言构造冲突

时间:2012-01-08 11:48:25

标签: php oop keyword php4

我只想在班级list()中命名一个方法。如果我尝试这样做:

class MyClass {

  function list () {
    // Do some stuff here
  }

}

...我得到一个解析错误(Unexpected T_STRING...)。如果我使用echoprint,情况也是如此 - 所以我猜我不允许将类方法命名为语言构造,while I cannot find any documentation that explicitly states this to be the case,我认为它确实如此有道理。

我的问题是,有没有人知道这方面的工作,可以在PHP 4.3.10中使用我知道这可以在带有闭包的PHP 5.3+中完成(或者我认为它可以,我还没有真正尝试过)迄今为止,没有任何版本的PHP支持使用闭包,但是任何人都可以想到一个不依赖于此的解决方法,请记住, name 方法在这里很重要吗?

编辑 N.B。

  

我完全了解PHP4的古老和死亡程度,但我对此特定项目没有选择权。它将在PHP 4.3.10平台上运行,这是一个资源非常低的BusyBox平台,带有MIPS处理器,没有提供编译器。我已经设法创建了一个交叉编译器并成功构建了PHP 5.2(我还没有尝试过5.3,它可能还涉及编译一个更新的Apache)但是无论如何,制造商坚持认为这会使他们无效保修。

4 个答案:

答案 0 :(得分:4)

在你选择A或B之前,你所面临的困境将一直存在。

  • 答:选择另一个不是保留字的功能名称。

  • B:更改PHP以便它提供您需要的语言功能。

PHP 4中不提供

__calllist是保留字since long time

你还没有概述你的类接口的具体问题,所以我看不到更多替代方案的空间。

由于B在这里看起来不像是一个真正的选择,你需要拿A。

希望这有助于您得出结论。

答案 1 :(得分:3)

Reserved keywords are reserved:

  

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

重命名方法。

答案 2 :(得分:1)

你有两个选择。

1)重命名您的方法。除非有一个真正的理由你可以证明你的方法的名称,那么这就是你应该做的。

2)命名你的班级。如果将类包装在自己的命名空间中,则可以重用通常为保留或预定义函数的名称,或者在其他位置定义的名称。但是,如果你知道自己在做什么,你应该只使用这种方法,否则你最终会造成很多混乱。

我会选择选项1,除非你有一个非常令人信服的理由,为什么你的方法名必须与PHP保留字同名。

编辑:您使用的是PHP 4,因此选项2不在桌面上。您唯一的选择是为您的方法使用不同的名称。那,或升级到PHP 5.3。即使你最后没有使用命名空间,我也强烈建议升级到PHP 5.3,因为PHP 4已经死了并且已经存在了很长时间。将不会再发布任何安全补丁,因此通过运行它基本上使您的服务器非常不安全。

答案 3 :(得分:0)

有点肮脏的黑客,但你可以使用魔法。 PHP4并不像php5那样真正支持__call,但它可以与'overload'构造一起使用。我没有测试过,所以我不能确定..

http://php.net/manual/en/function.overload.php

class MyClass {
  function __call($func, $args){
    if ($func == 'list')
      return $this->_list($args);      
  }

  function _list () {
    // Do some stuff here
  }
}

overload('MyClass');

$myclass = new MyClass();
$myclass->list();