PHP / Zend se plaint des variables non définies
-
13-09-2019 - |
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.
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