PHP/Zend beschwert sich über undefinierte Variablen
-
13-09-2019 - |
Frage
Die 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 beachten:Undefinierte Variable:X
Globales $x platzieren;in bar.php entfernt den Hinweis, aber ich verstehe, warum es überhaupt einen Hinweis dazu gibt.Ist nicht so viel Arbeit wie das Einfügen von C-Headern enthalten?Das würde bedeuten, dass der interpretierte Code so aussehen würde:
<?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
?>
Mein Editor ist das Eclipse/Zend-Paket.
Lösung
Ich bin kein Experte, also bitte Flamme mich nicht, wenn ich falsch, aber ich denke, die von include_once oder require_once aufgerufenen Datei im Kontext des Anrufers genannt wird. Da Funktion foo () werden nicht über dann $ wissen x weder wird eine ihrer genannt enthält. Sie könnten experimentieren, indem wie oben $ x innen Funktion foo () mit dem gleichen Setup ‚erklärt‘.
Andere Tipps
Ich bekomme eine Menge dieser Hinweise, da ich fast immer „$o .= 'foo'“ ohne Definition verwende.Ich verstecke sie nur mit error_reporting(E_ALL ^ E_NOTICE), aber ich weiß nicht, ob es in diesem Fall der optimale Weg ist.
Es funktioniert nicht, auch wenn die Variablen und die Funktion in der gleichen Datei sind.
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 echo $x;
8 }
9
10 t();
Prints nichts.
Aber fügen Sie eine globale
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 global $x;
8 echo $x;
9 }
10
11 t();
und Sie können sehen, "3".
In einer Funktion können Sie keine globalen Variablen sehen, wenn Sie es erklären.
ja sein der Funktionsumfang, die Ihre Probleme verursachen
Wenn Sie ersetzen
foo("bar.php");
mit
include("bar.php");
Sie werden sehen, dass alles funktioniert, weil sie es in den aktuellen Bereich setzt und nicht die Funktionen Anwendungsbereich