2009-07-30 6 views
1

J'intègre du code tiers dans l'application web que j'écris dans Zend Framework.Est-ce que Zend Framework désactive la déclaration des variables comme globales?

Le code que je veux intégrer déclare les variables comme globales. Cela fonctionne tout seul, mais pas quand je l'inclue dans Zend Framework. Au départ, je soupçonnais qu'il y a quelque chose dans Zend Framework qui désactive la déclaration des variables globales. J'ai le code de test suivant dans un contrôleur:

public function testglobalAction() 
{ 
    $a = 1; 
    function b() 
    { 
     global $a; 
     echo $a*2; 
    } 

    b(); 
} 

Quand je l'ai couru imprime 0, par opposition à 2. En plus de cette course le même code lui-même dans les mêmes impressions serveur web sur 2. Je comprends que je pourrais remplacer toutes les instances globales pour utiliser le registre Zend. Cependant, un grep m'a montré qu'il y a environ 700 lignes que je dois changer, donc ce n'est pas faisable pour le moment.

Est-ce que quelqu'un sait comment je peux résoudre ce problème? No. Zend Framework ne désactive pas les globals, car cela n'est pas possible.

+2

Globals ne sont pas une bonne idée en PHP. Zend te fait une faveur. – RaYell

+0

Je savais que ce serait le premier commentaire/réponse que j'obtiendrais avec cette question! :) Mais j'intègre vraiment ce code dans mon application. – Marcel

+1

Indiquez le code lorsque vous l'exécutez à partir du contrôleur. Je ne vois rien de lié à ZF dans votre échantillon. Oversimplification = nous ne pouvons pas vous aider. – hobodave

Répondre

8

Votre variable $ a originale n'est pas globale.

Toute variable déclarée à l'intérieur d'une méthode est locale à cette méthode, sauf si a déjà été déclarée globale dans la portée actuelle.

Essayez cette

public function testglobalAction() 
{ 
    global $a; 
    $a = 1; 
    function b() 
    { 
     global $a; 
     echo $a*2; 
    } 

    b(); 
} 
+0

En outre, la portée PHP empêche l'accès aux variables locales externes dans les fonctions/appels internes, en dépit du fait que ces variables sont toujours en mémoire active et accessibles au flux applicatif une fois sorties de la fonction interne. – eyelidlessness

+1

Presque sans paupière. Avant PHP 5.3, les fonctions "internes" n'existaient pas. Lorsque vous définissez une fonction dans une méthode comme ci-dessus, vous définissez en fait une fonction dans la portée globale (si vous appelez testglobalAction, vous obtiendrez une erreur fatale: Impossible de redéclarer b() PHP 5.3 introduit de vraies fonctions et fermetures lambda, et vous oblige à spécifier les variables que vous souhaitez importer à partir de la portée externe. –

1

Le tableau $ GLOBALS est contrôlé par la directive php.ini register_globals. Il ne peut pas être modifié à l'exécution en utilisant ini_set. Voir le documentation pour référence.

Remarque: Vérifiez vos fichiers .htaccess pour les remplacements php_value par répertoire.

+0

J'ai essayé d'activer register_globals et j'ai obtenu le même résultat. Il n'y a pas non plus de php_value qui surcharge la directive. C'est drôle que j'ai un fichier de test dans le même serveur web qui imprime 2 qui est le résultat attendu. Cependant, lorsque j'exécute ce code dans un contrôleur, j'obtiens 1. – Marcel