Question

La situation:

index.php:

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

baz.php:

<?php
    $x = 42;
?>

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

Placement global $x;dans bar.php supprime l'avis, mais je comprends pourquoi il y a un avis à ce sujet en premier lieu..Ne comprend pas assez bien travailler comme y compris les en-têtes C?Cela signifie que le code interprété devrait ressembler à 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 l'Éclipse/Zend paquet.

Était-ce utile?

La solution

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

Autres conseils

Je reçois un tas de ces avis car je suis presque allways va avec "$s .= 'foo'", sans définition.Je suis juste en les cachant avec error_reporting(E_ALL ^ E_NOTICE), mais je ne sais pas si c'est la façon optimale dans ce cas.

Il 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();

Ne imprime rien.

Mais ajouter un globale

  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".

En fonction vous ne pouvez pas voir les variables globales à moins que vous déclarez.

oui sa 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 la portée actuelle et non la portée des fonctions

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top