2009-06-15 7 views
0

La situation:PHP/Zend se plaint de variables non définies

index.php:

<?php 
    include("foo.php"); 
    include("baz.php"); 
     foo("bar.php"); 
?> 

baz.php:

<?php 
    $x = 42; 
?> 

fichier foo.php:

<?php 
    function foo($p) { 
     include_once($p); // please dont mind the inclusion hole 
    } 
?> 

bar.php:

<?php 
    echo $x; 
?> 

Zend avis: Undefined variable: x

x Placer global $; dans bar.php supprime l'avis, mais je comprends pourquoi il ya un avis à ce sujet en premier lieu .. N'inclut pas assez de travail comme l'inclusion des en-têtes C? Cela signifierait que le code interprété ressemblerait à ceci:

<?php 
    function foo($p) { 
     include_once($p); // please dont mind the inclusion hole 
    } 
    $x = 42; 

    // this however, is included by a function... 
    // does the function's scope influence the stuff it includes? 
    echo $x; // undefined variable 
?> 

Mon éditeur est le package Eclipse/Zend.

Répondre

3

Je ne suis pas un expert, alors s'il vous plaît ne me flamme pas si je me trompe, mais je pense que le fichier appelé par include_once ou require_once est appelé dans le contexte de l'appelant. Puisque la fonction foo() ne connaîtra pas $ x, aucun de ses appels ne sera inclus. Vous pouvez expérimenter en 'déclarant' $ x dans la fonction foo() avec la même configuration que ci-dessus.

+0

Je suis porté à croire que vous avez raison. Placer un $ global à l'intérieur de la fonction foo() fixe également l'erreur de notices. Je serais intéressé de voir n'importe quelle page de doc à ce sujet, et pourquoi PHP réussit toujours à exécuter le code juste bien mais produit un avis. –

+1

La raison pour laquelle vous n'obtenez pas d'erreur est simple: L'utilisation de variables non déclarées n'est pas une erreur dans PHP.Il produit toujours un avertissement et continue l'exécution. C'est pourquoi je préfère toujours déclarer mes propres gestionnaires d'erreur et lancer une exception sur toutes les erreurs/avertissements/avis. Un bon code ne devrait en produire aucun de toute façon. – soulmerge

0

Je reçois beaucoup de ces avis puisque je suis presque toujours avec "$ o. = 'Foo'" sans aucune définition. Je les cache juste avec error_reporting (E_ALL^​​E_NOTICE), mais je ne sais pas si c'est la manière optimale dans ce cas.

+0

Vous voulez probablement dire E_ALL | E_NOTICE, le caractère caret est un opérateur unaire. – soulmerge

0

Cela ne fonctionne pas même si la variable et la fonction sont dans le même fichier.

1 <?php 
    2 
    3 $x = 3; 
    4 
    5 function t() 
    6 { 
    7 echo $x; 
    8 } 
    9 
10 t(); 

N'imprime rien.

Mais ajouter un

global
1 <?php 
    2 
    3 $x = 3; 
    4 
    5 function t() 
    6 { 
    7 global $x; 
    8 echo $x; 
    9 } 
10 
11 t(); 

et vous pouvez voir "3".

Dans une fonction, vous ne pouvez pas voir les variables globales sauf si vous les déclarez.

0

oui c'est la portée de la fonction qui est la cause de vos problèmes

si vous remplacez

foo("bar.php"); 

avec

include("bar.php"); 

vous verrez que tout fonctionne bien parce qu'il met dans le Portée actuelle et non portée des fonctions

Questions connexes