PHP/Zend жалуется на неопределенные переменные

Ситуация:

индекс.php:

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

баз.php:

<?php
    $x = 42;
?>

foo.php:

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

бар.php:

<?php
    echo $x;
?>

Zend уведомление: неопределенная переменная: 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.


person Community    schedule 15.06.2009    source источник


Ответы (4)


Я не эксперт, поэтому, пожалуйста, не ругайте меня, если я ошибаюсь, но я думаю, что файл, вызываемый include_once или require_once, вызывается в контексте вызывающего. Поскольку функция foo() не будет знать о $x, то и ни одно из ее вызываемых включений не будет знать. Вы можете поэкспериментировать, «объявив» $x внутри функции foo() с той же настройкой, что и выше.

person Dave Archer    schedule 15.06.2009
comment
Я склоняюсь к тому, что ты прав. Размещение глобального $x; внутри функции foo() также исправляет ошибку извещения. Мне было бы интересно увидеть любую страницу документа об этом и о том, почему PHP все еще удается выполнять код просто отлично, но выдает уведомление. - person ; 15.06.2009
comment
Причина, по которой вы не получаете сообщение об ошибке, проста: использование необъявленных переменных не является ошибкой в ​​PHP. Он всегда выдает предупреждение и продолжает выполнение. Вот почему я всегда предпочитаю объявлять свои собственные обработчики ошибок и создавать исключения для всех ошибок/предупреждений/уведомлений. В любом случае хороший код не должен производить ни одного из них. - person soulmerge; 15.06.2009

Я получаю кучу таких уведомлений, так как почти всегда использую "$o .= 'foo'" без какого-либо определения. Я просто скрываю их с помощью error_reporting(E_ALL ^ ​​E_NOTICE), но не знаю, оптимальный ли это способ в данном случае.

person Ivar    schedule 15.06.2009
comment
Вы, вероятно, имеете в виду E_ALL | E_NOTICE, символ вставки является унарным оператором. - person soulmerge; 15.06.2009

Это не работает, даже если переменная и функция находятся в одном файле.

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

В функции вы не можете видеть глобальные переменные, пока не объявите их.

person Dutow    schedule 15.06.2009

да, это область функций, которая вызывает ваши проблемы

если вы замените

foo("bar.php");

с

include("bar.php");

вы увидите, что все работает нормально, потому что он помещает его в текущую область, а не в область функций.

person Galen    schedule 15.06.2009