2012-01-08 54 views
1

发生冲突,我只是想说出在我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的最新支持任何的版本与封这样做,但任何人都可以想到的工作围绕着不依赖于此,请记住,这是名称这种方法在这里很重要吗?

编辑N.B.

我完全知道PHP4的古老和死亡,但我没有选择这个特定的项目。它将在一个分布有PHP 4.3.10的平台上运行,该平台是一个非常低资源的BusyBox平台,带有一个MIPS处理器,没有编译器。我设法创建了一个交叉编译器,并成功为其构建了PHP 5.2(我还没有尝试过5.3版本,可能还需要编译一个更新的Apache),但无论如何,制造商坚持认为这会使保修失效。

+2

您正在寻找本页:[PHP保留关键词](http://php.net/manual/en/reserved.keywords.php) – 2012-01-08 11:52:44

+1

为什么你不能只是将它命名为别的?例如,list()'='listing()','echo()'='e()'和'print()'='p()'。 – Treffynnon 2012-01-08 11:54:28

+0

@Cicada非常感谢,因为我认为必须有一个手册页,我错过了这一页。我仍然认为可能会有某种方法可以在PHP4中动态地定义一个方法,但是我不知道它是什么。 – DaveRandom 2012-01-08 11:55:08

回答

4

你所面临的困境将持续到你选择A或B.

  • 答:选择另一个函数名,一个是保留字。

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

__call是不是在PHP 4提供list是一个保留字since long time

而你没有概述你的具体问题与类接口是什么,所以我没有看到更多的选择空间。

由于B没有看起来像一个真正的选择在这里,你需要采取A.

希望这有助于你可以得出一个结论。

+0

我在想A会是唯一的选择。我从同事那里得到了支持,但我可能只会告诉他和他一起生活或自己修复它。我可以理解他希望坚持一个非常明确的界面,但如果这是不可能的,那么这是不可能的。你可能有一个美味的+1这个:-) – DaveRandom 2012-01-08 12:54:56

1

你有两个选择。

1)重命名你的方法。除非有真正的理由,否则你可以证明你方法的名字是正确的,那么这是你应该做的。

2)namespace your class。如果您将类包装在自己的名称空间中,那么您可以重用通常保留的或预定义的函数的名称,或在别处定义的名称。但是,如果你知道自己在做什么,那么你应该只使用这种方法,否则你可能会导致很多混淆。

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

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

+1

重新2:OP说它应该对死PHP。此外,命名空间的建议无论如何也不会起作用(保留保留):http://codepad.viper-7.com/a9FIFO – Gordon 2012-01-08 12:13:25

+0

我完全知道PHP4是如何古老而死的,但我没有选择这个特定的项目。它将在一个分布有PHP 4.3.10的平台上运行,该平台是一个非常低资源的BusyBox平台,带有一个MIPS处理器,没有编译器。我设法创建了一个交叉编译器,并成功为其构建了PHP 5.2(我还没有尝试过5.3版本,可能还需要编译一个更新的Apache),但无论如何,制造商坚持认为这会使保修失效。 – DaveRandom 2012-01-08 12:16:58

+0

@戈登:我不知道这些保留字,谢谢检查。我只用过这个技巧一次,这是为了一个功能的构建,所以谢谢澄清。 – GordonM 2012-01-08 12:53:11

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