我有一个文件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.
所以我得到了问题,但如何解决呢?我需要一种方法让函数获得一个比它高一级的变量,而不管下一级是否是全局的。有什么想法吗?
答案 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?