我正在编写一个基于单个index.php文件的PHP应用程序,该文件使用单个Main
类根据请求的页面加载不同的文件。但是,我希望能够从页面文件中访问此Main
类实例。
我的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
变量,或者更好的方法来执行此操作,我错过了?
答案 0 :(得分:2)
page.php中的代码正在Main
实例的上下文中执行。您实际上可以直接访问$this
。所以:
$this->doUsefulStuff()
答案 1 :(得分:1)
你所做的并不是最好的想法,但这是另一回事。您遗漏的是您require
的代码被有效地粘贴到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 = $_GET['page'] . ".php";
之类的内容。在某人有这样的代码:这只是要求安全问题。想想如果$_GET['page']
之类的话会发生什么:
/etc/passwd #
您需要/etc/passwd
!