2013-02-13 152 views
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已被直接调用。它不能使用重定向,也不能通过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. 

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

回答

0

在sometimesInvoker.php使第一行require_once 'standalone.php';

+0

根据'sometimesInvoker.php'中发生的情况,'standalone.php'可能根本不包含,也可能根本不包含。 'sometimesInvoker.php'中的函数决定是否包含'standalone.php'或'anotherstandalone.php'等。 – Nick 2013-02-13 18:55:49

+0

如果您在课堂中包含/要求独立,则该课程始终是本地课程。看起来你正在遭受一些糟糕的设计决定。使数据库连接成为自己的类并将其注入到每个需要它的类中。'$ db = new DB(); $ loadpage = new LoadPage(); $ loadpage-> setDB($ db);' – mkaatman 2013-02-13 19:02:02

0

我需要一种方式,一个函数来获取一个变量,它是一个级别以上,不管如果下一级是全球性的或没有。

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

使用“全球”使用变量在其他范围:

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

或者变量传递到功能:

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

还是我错过了点?

+0

在这种情况下,$ DB在需要它的函数之上,但是$ DB实际上不在全球名字空间。 $ DB在一个父函数中,它是$ DB var和需要$ DB var的函数的父类。 – Nick 2013-02-13 19:12:23

+0

怎么样使用$ DB = DB();在子功能里面? – 2013-02-13 19:20:01

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在父函数中,而不是全局名称空间?