当从函数中包含的包含文件调用时,全局的作用域问题


Scoping issue with global when called from included file included within a function?

我有一个文件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一样。它不能使用重定向,也不能通过URL包含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.

所以我明白这个问题,但如何解决呢?我需要一种方法,让函数获得一个高于它一级的变量,无论下一级是否全局。有什么想法吗?

有时Invoker.php会生成第一行require_once 'standalone.php';

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

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

使用"全局"在另一个范围中使用变量:

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

或者将变量传递到函数中:

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

还是我没有抓住要点?

这是我目前用来解决问题的解决方法。将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?