PHP / Zend жалуется на неопределенные переменные - PullRequest
0 голосов
/ 15 июня 2009

Ситуация:

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

Размещение глобальных $ x; в bar.php удаляет это уведомление, но я понимаю, почему в первую очередь есть уведомление об этом. Это будет означать, что интерпретируемый код будет выглядеть так:

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

Ответы [ 4 ]

3 голосов
/ 15 июня 2009

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

0 голосов
/ 15 июня 2009

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

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

foo("bar.php");

с

include("bar.php");

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

0 голосов
/ 15 июня 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".

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

0 голосов
/ 15 июня 2009

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

...