2012-03-26 67 views
2

我正在將PHP 5.2.x應用程序遷移到新的5.2.x服務器。舊服務器多年前實際上是作爲PHP 4.0服務器啓動的,隨着時間推移升級到PHP 5.2。如果此模塊多次使用,我們的其中一個模塊具有重新聲明的功能。我們可以很容易地解決這個問題,但是我們對它的工作方式感到困惑。Redeclare函數適用於舊服務器,但不是新的

在新的服務器會失敗,並預期:

Fatal error: Cannot redeclare function 

的問題是,舊的服務器上總是重複聲明的功能!有沒有PHP設置或特殊用法在這裏使用,使其在一臺服務器上工作,但不是另一臺?

謝謝!

編輯仍在嘗試如何實現這一點。該網站致命錯誤,但在該錯誤點後執行。

+2

你確定嗎?沒有一些**嚴重的[hackery](http://www.php.net/manual/en/ref.runkit.php),你永遠無法重新聲明一個PHP函數。 – ceejayoz 2012-03-26 20:52:01

+4

PHP4允許函數重新定義,PHP5不允許。您必須將模塊更改爲include_once/require_once,或將函數定義包裝在一個'if(!function_exists('...')){...}塊中。 – 2012-03-26 20:52:34

+0

@MarcB我真的一直在使用PHP5嗎?我可以發誓PHP4也不允許它。 – ceejayoz 2012-03-26 20:53:13

回答

1

重新聲明函數被認爲是錯誤。

也許你們可以使用「重命名功能」。

http://es.php.net/manual/en/function.rename-function.php

if(function_exist("foo")){ 
    rename_function('foo', 'old_foo'); 

    function foo(){ 
     /*...*/ 
    } 
} 

另一個想法是重新編寫代碼要重新定義$ foo的(這

$foo = function(){ /* something */.... }; 

所以接下來的時間),你做

$foo = function(){ /* something else */.... }; 
+0

雖然這不是一種真正可怕的做法嗎? – sbichenko 2012-11-11 19:34:27

+0

@exizt歡迎使用PHP – Dan 2014-02-26 21:30:14

0

我無法重現你的描述,PHP 4不允許你重新聲明函數:

echo PHP_VERSION; 
function foo() {} 
function foo() {} 

演示/輸出:

4.4.9
Fatal error: Cannot redeclare foo() (previously declared in /homepages/26/d94605010/htdocs/lz/writecodeonline.com/php4/index.php(138) : eval()'d code:2) in /homepages/26/d94605010/htdocs/lz/writecodeonline.com/php4/index.php(138) : eval()'d code on line 3

你必須在這裏混的事情,所以更好的瞭解更多的事實調試時,不是在猜想(是的,我知道是很難的時候,但是在調試的時候事實幫助,瞄準他們)。

如果這是致命錯誤,則腳本結束。您可以添加一個關機回調函數來進一步調試您的問題,看到一個相關的問題:

相關問題