0

情况:

索引.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 中删除了通知,但我理解为什么首先会有关于此的通知.. 不包括像包括 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 包。

4

4 回答 4

3

我不是专家,所以如果我错了,请不要喷我,但我认为 include_once 或 require_once 调用的文件是在调用者的上下文中调用的。由于函数 foo() 不知道 $x ,因此它的任何调用都不会包含。您可以通过与上述相同的设置在函数 foo() 中“声明”$x 来进行试验。

于 2009-06-15T08:59:51.340 回答
0

我收到了一堆这样的通知,因为我几乎总是使用 "$o .= 'foo'" 没有任何定义。我只是用 error_reporting(E_ALL ^ E_NOTICE) 隐藏它们,但我不知道这是否是这种情况下的最佳方式。

于 2009-06-15T09:05:48.207 回答
0

即使变量和函数在同一个文件中,它也不起作用。

  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”。

在函数中,除非您声明它,否则您看不到全局变量。

于 2009-06-15T09:07:58.343 回答
0

是的,它是导致您的问题的功能范围

如果你更换

foo("bar.php");

include("bar.php");

您会看到一切正常,因为它将其放入当前范围而不是函数范围

于 2009-06-15T09:10:07.713 回答