使用require_once / ob_start()进行可变访问

时间:2013-07-14 07:15:09

标签: php apache ob-start

也许我只是感到厌倦或只是感到困惑,但是我遇到了一些奇怪的问题,处理了一些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可以执行。

2 个答案:

答案 0 :(得分:2)

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


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

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

答案 1 :(得分:1)

documentation说:

  

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