2012-01-08 49 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();