2012-03-26 1 views
2

Je migre une application PHP 5.2.x vers un nouveau serveur 5.2.x. L'ancien serveur a effectivement démarré en tant que serveur PHP 4.0 il y a de nombreuses années et était mis à niveau vers PHP 5.2 au fil du temps. Un de nos modules a une fonction qui est redéclarée si ce module est utilisé plus d'une fois. Nous pouvons facilement résoudre ce problème, mais nous sommes perplexes quant à la façon dont cela aurait pu fonctionner.La fonction Redéclare fonctionne sur l'ancien serveur mais n'est pas nouvelle

Sur le nouveau serveur, il échouera avec un prévu:

Fatal error: Cannot redeclare function 

Le problème est que sur l'ancien serveur, il a été toujours nouvelle déclaration de la fonction! Existe-t-il un paramètre PHP ou un usage spécial ici qui le fait fonctionner sur un serveur mais pas sur un autre?

Merci!

Modifier Toujours en train d'essayer de voir comment cela est possible. Le site erreurs FATAL mais a une exécution après ce point d'erreur.

+2

Etes-vous sûr? Sans un peu de ** sérieux ** [hackery] (http://www.php.net/manual/en/ref.runkit.php), vous ne pouvez jamais redéclarer une fonction PHP. – ceejayoz

+4

PHP4 a permis des redéclations de fonction, PHP5 non. vous devrez changer le module en include_once/require_once, ou envelopper la définition de la fonction dans un bloc 'if (! function_exists ('...')) {...}'. –

+0

@MarcB Ai-je vraiment utilisé PHP5 aussi longtemps? Je pourrais jurer que PHP4 ne le permet pas non plus. – ceejayoz

Répondre

1

La redéclaration de fonctions est considérée comme une erreur. Peut-être que vous pouvez utiliser "renommer la fonction".

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

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

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

Une autre idée est de réécrire le code pour le faire

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

Alors, la prochaine fois que vous voulez redéfinir $ foo(), vous

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

N'est-ce pas une pratique vraiment, vraiment terrible, cependant? – sbichenko

+0

@exizt Bienvenue sur PHP – Dan

0

Je n'arrive pas à reproduire votre description, PHP 4 ne vous permet pas de redéclarez les fonctions:

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

Demo/Sortie:

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

Vous devez mélanger les choses ici, afin de mieux en savoir plus sur les faits lors de débogage, pas deviner (oui je sais peut être difficile parfois, mais les faits aider lors du débogage , viser pour eux).

Et si c'est une erreur fatale, votre script se termine. Vous pouvez ajouter une fonction de rappel d'arrêt pour déboguer davantage votre question, consultez une question connexe:

Questions connexes