【问题标题】:Variable accessibility with require_once/ob_start()使用 require_once/ob_start() 的变量可访问性
【发布时间】:2013-07-14 07:15:09
【问题描述】:

也许我只是累了或只是感到困惑,但我在处理一些require_once() 电话和ob_start() 时遇到了一个奇怪的问题。

基本结构:

Main.php 顶部:

require_once 'config.php'; // includes variable $A = "bar", and Function "foo"

function getPage(){
  ob_start();
  include 'some_file.php';
  $html = ob_get_clean();
  echo $html;
  die();
}
getPage();

some_file.php

require_once 'config.php'; // includes same config file
var_dump($A); // NULL
foo(); // runs, returns correct value

Config.php

$A = 'bar';

function foo(){
  return "FOO";
}

那么,这里有什么问题?我在缓冲输出时包含一个文件。所需的文件config.php 包含一个变量和函数。在缓冲区中包含some_file.php 时,变量$A 显然是不可设置/不可访问的。函数foo可以执行。

【问题讨论】:

  • 是否有您没有向我们展示的函数(在 main.php 或 some_file.php 中)?
  • 您在哪里使用显然未设置的$A?请向我们展示更完整的SSCCE
  • 无论何时包含/要求,类和函数都在全局范围内声明;被包含的文件中的变量仅在包含语句之后才可用。

标签: php apache ob-start


【解决方案1】:

documentation 说:

当一个文件被包含时,它包含的代码会继承该变量 包含发生的行的范围。任何可用的变量 在调用文件中的该行将在被调用中可用 文件,从那时起。但是,所有函数和类 在包含的文件中定义的具有全局范围。

【讨论】:

    【解决方案2】:

    您提供的代码并未说明您所描述的问题。当我按原样运行它时,它正确显示变量已定义。


    话虽如此,要记住的是,包含文件中看起来像全局变量的东西实际上最终会在调用它的函数的范围内。因此,如果第一次调用 require_once() 是从函数中调用的,则 $A 变量的作用域是函数 - 并且在函数返回时消失,就像函数内部定义的任何其他变量一样。

    如果您绝对必须在包含的文件中定义一个全局变量(您确定吗?真的吗?),请确保您仅在全局范围内包含该文件 - 而不是在函数内。如果需要从函数内访问变量,请将文件包含在函数外,然后使用global 关键字从函数内访问变量。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2015-07-20
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多