PHP/Zend жалуется на неопределенные переменные
-
13-09-2019 - |
Вопрос
Ситуация:
индекс.php:
<?php
include("foo.php");
include("baz.php");
foo("bar.php");
?>
баз.php:
<?php
$x = 42;
?>
фу.php:
<?php
function foo($p) {
include_once($p); // please dont mind the inclusion hole
}
?>
бар.php:
<?php
echo $x;
?>
Зенд уведомление:Неопределенная переменная:Икс
Размещение глобального $x;в bar.php удаляет уведомление, но я понимаю, почему об этом вообще есть уведомление..Не включает в себя большую часть работы, например, включение заголовков C?Это означало бы, что интерпретируемый код будет выглядеть так:
<?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
?>
Мой редактор — пакет Eclipse/Zend.
Решение
Я не эксперт, поэтому, пожалуйста, не обижайте меня, если я ошибаюсь, но я думаю, что файл, вызываемый include_once или require_once, вызывается в контексте вызывающего объекта.Поскольку функция foo() не будет знать о $x, то и ни один из ее вызовов не будет включать.Вы можете поэкспериментировать, «объявив» $x внутри функции foo() с той же настройкой, что и выше.
Другие советы
Я получаю кучу таких уведомлений, поскольку почти всегда использую «$o .= 'foo'» без какого-либо определения.Я просто скрываю их с помощью error_reporting(E_ALL^E_NOTICE), но не знаю, оптимальный ли это способ в данном случае.
Это не работает, даже если переменная и функция находятся в одном файле.
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 echo $x;
8 }
9
10 t();
Ничего не печатает.
Но добавьте глобальный
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 global $x;
8 echo $x;
9 }
10
11 t();
и вы можете увидеть цифру «3».
В функции вы не увидите глобальные переменные, если не объявите их.
да, именно область функции вызывает ваши проблемы
если вы замените
foo("bar.php");
с
include("bar.php");
вы увидите, что все работает нормально, потому что оно помещает его в текущую область, а не в область функций.