2

我有一个文件 ,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不能通过 URL 包含。

中的代码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.

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

4

3 回答 3

0

我需要一种方法来让函数获取比它高一级的变量,而不管下一级是否是全局的。

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

使用“全局”在另一个范围内使用变量:

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

或者将变量传递给函数:

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

还是我错过了重点?

于 2013-02-13T18:56:32.297 回答
0

在有时Invoker.php 做第一行require_once 'standalone.php';

于 2013-02-13T18:51:31.637 回答
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?

于 2013-02-13T19:10:38.553 回答