我有一个文件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?