2011-03-10 50 views
2

我必須將一個網站(自定義編寫(不是我)),所以只是更新CMS不是一個選項)到PHP 5.3服務器。該代碼抱怨::我可以在PHP 5.3中恢復舊的__tostring()行爲嗎?


Fatal error: Method cDate::__tostring() cannot take arguments in ...\lib.datetime.php on line 183 

我GOOGLE找出這個問題是因爲「用PHP 5.3的魔術方法__toString()不再接受任何參數」,」 ......實現其__toString()通過接受參數...現在已被棄用,以支持PHP 5.3的新__tostring()。 下面的代碼:


public function __toString($format = 'Y-m-d') 
{ 
    // the next is the line #182, the line #183 mentioned in the error message is the closing brace 
    return date($format, $this->_stamp); 
} 

有什麼樣一個php.ini參數我可以調整,使該回去上班?

我不是一個PHP開發人員,我也不太願意去研究和修改一些web dev外包公司過去爲我工作的公司編寫的代碼。我的任務是將網站從共享主機提供商移到我管理的專用服務器(我在那裏運行Ubuntu 10.04 LTS服務器),並且我寧願不要降級到PHP 5.2。如果我能夠使用一些配置魔法,它將會很棒。我擔心,如果我修改一個方法,那麼整個事情就會按預期停止工作。

+0

有迫使4兼容性INI參數,但它已被刪除。 – powtac 2011-03-10 14:02:19

+1

通常不直接調用__toString()。它在類中用於決定將對象作爲字符串進行轉換時要執行的操作。所以問題是,你的__toString()方法的目的是什麼? – powtac 2011-03-10 14:05:06

+2

我不認爲在棄用的行爲中堅持是要走的路,也許你應該考慮更新你的代碼,找到完成相同任務的另一種方式。 – Terseus 2011-03-10 14:06:16

回答

4

你不能讓__toString()再次接受參數。方法簽名需要很淺。 (我同意這是一個不必要的棄用,爲什麼他們不只是拋出E_DEPRECATED,而不是產生一個致命的不兼容是不是很明智的。)

唯一的解決方法是利用func_get_args()代替真實參數:

class EmptyString { 
    function __toString() { 
     print_r(func_get_args()); 
     return ""; 
    } 
} 

這將使5.3調用隱含的__toString爲"$so";,但仍允許手動$so->__toString(_WITH, "params");

這個方案當然不允許簡單的參數默認值。而且你的目標是讓舊版應用程序正常工作,所以它是不夠的。您需要在基類中實現此解決方法,並將現有的__toString方法調整爲__oldString,並以compat模式調用。有一點重寫是沒有辦法的。


沒有任何複雜的包裝方法,您的具體示例代碼改編:

public function __toString() 
{ 
    $format = func_get_arg(0) or $format = 'Y-m-d'; 

    return date($format, $this->_stamp); 
} 
+0

謝謝。我已將代碼添加到問題主體中。它看起來很簡單,但我不知道如何修改它以符合PHP 5.3,並仍然按照預期的方式工作(通過所有其他可以依賴的代碼)。 – Ivan 2011-03-10 14:30:35

+0

@Ivan:請參閱編輯 – mario 2011-03-10 14:37:53

+0

它不被棄用,因爲它已經存在,因爲從PHP5開始,在此之前它已經在受保護的函數名稱列表中。 – powtac 2011-03-10 14:50:12

2

如果問題只出現在這個類中,您可以更新該類的代碼。

創建一個覆蓋方法__toString(),它接受參數,該調用是父級或完全重寫方法的代碼(我認爲它不那麼難)。

但是對於更多信息,我們需要一些代碼來解決上下文中的問題。

編輯:好吧,我認爲更好的解決辦法是:

  1. 重命名方法和他的所有電話。因爲,__toString保留給magick方法:printDate($fomat='Y-m-d')
  2. 添加一個新的方法__toString()調用您的printDate()

及用途:

public function __toString() 
{ 
    $format = isset(func_get_arg(0) ? func_get_arg(0) : 'Y-m-d'; 
    return date($format, $this->_stamp); 
} 
+0

我已將代碼添加到問題正文中。它看起來很簡單,但我不知道如何修改它以符合PHP 5.3,並仍然按照預期的方式工作(通過所有其他可以依賴的代碼)。 – Ivan 2011-03-10 14:29:11

相關問題