2012-03-26 5 views
2

Я переношу приложение PHP 5.2.x на новый сервер 5.2.x. Старый сервер фактически запускался как сервер PHP 4.0 много лет назад и с течением времени обновлялся до PHP 5.2. Один из наших модулей имеет функцию, которая получает redeclared, если этот модуль используется более одного раза. Мы можем легко исправить это, но мы озадачены тем, как он мог работать.Функция Redeclare работает на старом сервере, но не является новой

На новом сервере он не сможет с ожидаемым:

Fatal error: Cannot redeclare function 

Проблема заключается в том, что на старом сервере он всегда был повторно объявить функцию! Есть ли здесь параметр PHP или специальное использование, которое заставляет его работать на одном сервере, но не в другом?

Спасибо!

Редактировать По-прежнему пытается пролить, как это возможно. Ошибки сайта FATAL, но имеет выполнение после этой точки ошибки.

+2

вы уверены? Без каких-либо ** серьезных ** [хакеров] (http://www.php.net/manual/en/ref.runkit.php) вы никогда не сможете обновить функцию PHP. – ceejayoz

+4

PHP4 допускает переопределения функций, PHP5 - нет. вам придется изменить модуль на include_once/require_once или обернуть определение функции в блок 'if (! function_exists ('...')) {...}'. –

+0

@MarcB Я действительно давно использовал PHP5? Я могу поклясться, что PHP4 тоже этого не допускает. – ceejayoz

ответ

1

Функции Redeclaring учитывают ошибку.

Возможно, вы, ребята, можете использовать функцию переименования.

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

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

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

Другая идея заключается в том, чтобы переписать код, чтобы сделать это

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

Так что в следующий раз, когда вы хотите, чтобы переопределить $ Foo(), вы делаете

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

Не правда ли, это действительно ужасная практика? – sbichenko

+0

@exizt Добро пожаловать на PHP – Dan

0

Я не могу воспроизвести ваше описание, PHP 4 не позволяет вам обновлять функции:

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

Demo/Выход:

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

Вы должны смешивать вещи здесь, так что лучше узнать больше о фактах при отладке, не догадываясь (да, я знаю, может быть трудно иногда, но факты помогают при отладке , стремиться к ним).

И если это фатальная ошибка, ваш скрипт заканчивается. Вы можете добавить функцию выключения обратного вызова для дальнейшей отладки проблемы, см связанного с этим вопрос: