Php 从类函数中包含的文件访问全局变量

Php 从类函数中包含的文件访问全局变量,php,Php,我正在基于单个index.PHP文件编写一个PHP应用程序,该文件使用单个Main类根据请求的页面加载不同的文件。但是,我希望能够从页面文件中访问这个Main类实例 My index.php看起来有点像这样: class Main { public function init() { // Initialisation stuff } public function runPage() { // Obviously there's mor

我正在基于单个index.PHP文件编写一个PHP应用程序,该文件使用单个
Main
类根据请求的页面加载不同的文件。但是,我希望能够从页面文件中访问这个
Main
类实例

My index.php看起来有点像这样:

class Main {
    public function init() {
        // Initialisation stuff
    }

    public function runPage() {
        // Obviously there's more to it than this
        $page = "page.php";
        require_once $page;
    }

    public function doUsefulStuff() {
        // ...
    }
}

$main = new Main();
$main->init();
$main->runPage();
在我的page.php文件中,我希望能够访问
$main

$foo = $main->doUsefulStuff();
但是,这条线路出现以下故障:

未定义变量:第1行page.php中的main

致命错误:对第1行page.php中的非对象调用成员函数doUsefulStuff()


是否有任何方法可以访问
$main
变量,或者有更好的方法来访问我所缺少的变量?

page.php中的代码正在
main
实例的上下文中执行。实际上,您可以直接访问
$this
。因此:

$this->doUsefulStuff()

你所做的并不是最好的想法,但那是另一回事。您缺少的是
所需的代码有效地粘贴到
runPage
方法中,因此变量的作用域也相应地确定了。澄清:

//index.php
$someVar = new Main();
$someVar->runPage();

//Main::runPage()
{
    $someVar = 123;//local to this method
    require 'file.php';
}

//include/require file:
echo $someVar;
上述代码将返回123

如果希望
$main
作为这些必需文件中
main
实例的引用,只需添加以下内容:

$main = $this;
require 'thePage.php';
或者在所需代码中使用
$this

PS:您发布的初始伪代码包含类似于
$page=$\u GET['page']的内容。“.php”。有些人的代码是这样的:这只是要求安全问题。想想如果
$\u GET['page']
是这样的话会发生什么:

/etc/passwd #

您需要
/etc/passwd

你能发布page.php文件吗?code.page.php主要包含HTML和一些逻辑。除了上一行之外,没有其他与问题相关的内容。$page=$\u GET['page']。“.php”;需要一次$page;可怕的代码:)验证在哪里?直接使用来自用户(或浏览器)的值是一个安全问题。如果您确实需要这样做,那么您应该将其与whilelist进行比较,并且仅在其中的情况下使用它。为清晰起见进行编辑以删除有问题的伪代码。嗯。。。这是否意味着page.php可以访问
Main
类中的私有函数和变量?@c.cam108:是的,因为代码在类中执行context@c.cam108出于所有目的,您可能认为您的代码是由
require\u once
复制和粘贴的“不是最好的想法”—您有什么建议?PHP不是我的第一语言,所以我的设计考虑可能不是最好的。此外,还有输入验证,如示例代码中的注释所述。实际上,我不会将
$\u GET['page']
盲目地传递给
require\u一次
!PHP之所以成功,还有一个原因就是它的坏名声:什么都可以。index.php文件中的
开关($\u GET['page'])
就可以了。一种更复杂、更健壮、更像框架的方法是使用路由系统(看看主要的MVC框架是如何工作的)。我编辑了这个问题,以删除每个人都在讨论的伪代码。@c.cam108:好的,我将把关于
/etc/passwd
的部分留在这里。未来的游客可能会从中受益