从函数中包含的包含文件调用时,全局的范围问题?

时间:2013-02-13 18:22:54

标签: php include scope

我有一个文件standalone.php,它可以直接从浏览器作为自己的脚本运行。它定义了函数,类并包含其他文件。直接调用它可以正常工作。

它的代码如下:

$DB = new Database(DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_SERVER, '', true);
function DB() { global $DB; return $DB; }

单独运行时,$ DB在全局名称空间中定义,返回该对象的函数将获取全局$ DB对象。再次,这是有效的。

问题是,我有另一个文件sometimesInvoker.php,它是从浏览器调用的,在某些情况下,需要包含standalone.php并输出到浏览器,就好像standalone.php一样直接调用。它不能使用重定向,也不能通过网址包含standalone.php

sometimesInvoker.php中的代码是:

LoadPage();

function LoadPage(){
   include standalone.php;
}

所以层次结构如下:

Global name space / sometimesInvoker.php
   LoadPage() function
      standalone.php - thinks its global but it isn't
         $DB - declared intending to be global but is actually a variable inside LoadPage() function?
            function DB() - calls global DB and looks inside sometimesInvoker.php for a $DB var which isn't there, should be going up one level to LoadPage() function and grabbing that var.

所以我得到了问题,但如何解决呢?我需要一种方法让函数获得一个比它高一级的变量,而不管下一级是否是全局的。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在SometimesInvoker.php中创建第一行require_once 'standalone.php';

答案 1 :(得分:0)

我需要一种方法让函数获得一个比它高一级的变量,无论下一级是否是全局的。

我不知道我是否理解正确但是,有几种方法可以在子功能中使用变量;

使用"全球"在另一个范围内使用变量:

$db='whatever';
function XXYYY(){
 global $db;
 echo $db;
}

或者将变量传递给函数:

$db='whatever';
function XXYYY($db){
 echo $db;
}

或者我错过了这一点?

答案 2 :(得分:0)

这是我现在用来解决问题的一种解决方法。将DB()函数更改为:

function DB() {
   static $DB = null;
   if(is_null($DB))
      $DB = new Database(DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_SERVER, '', true);
   return $DB;
}

在DB函数中使用静态变量让我实例化一次类,而不是依赖于全局变量。这解决了这种情况下的问题,但我仍然有兴趣知道如果var是在父函数中而不是全局命名空间中,是否可以访问函数外部的var?