Вопрос

Ситуация:

индекс.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");

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top