我有一个文件,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.
所以我得到的问题,而是如何解决呢?我需要一种方法让函数获得一个高于它的变量,而不管下一级是否是全局的。有任何想法吗?
根据'sometimesInvoker.php'中发生的情况,'standalone.php'可能根本不包含,也可能根本不包含。 'sometimesInvoker.php'中的函数决定是否包含'standalone.php'或'anotherstandalone.php'等。 – Nick 2013-02-13 18:55:49
如果您在课堂中包含/要求独立,则该课程始终是本地课程。看起来你正在遭受一些糟糕的设计决定。使数据库连接成为自己的类并将其注入到每个需要它的类中。'$ db = new DB(); $ loadpage = new LoadPage(); $ loadpage-> setDB($ db);' – mkaatman 2013-02-13 19:02:02