我有一个php框架,我通过索引文件路由所有请求。在索引文件中我有:
的index.php
$module = new module();
$module->SetName("user");
$call = new call();
$call->SetController("login");
然后我做了一些处理来查找请求的控制器文件。一旦找到,我就
$call->LoadController()
此方法需要模块指定的文件并调用。在这种情况下,它会做
require_once CONTROLLERS . "user/"."login.php"
一切顺利到这里。在加载的控制器文件中我做
controllers/user/login.php
$call->SetView("login")
我得到了一个php错误
undefined variable $call
我不确定为什么?
答案 0 :(得分:2)
class module
{
public function LoadController()
{
global $call;
require_once('controllers/user/login.php');
}
}
但这个解决方案很难看。
第二个解决方案是在包含的控制器文件中使用$ this-> SetView()而不是$ call-> SetView()。这个解决方案的缺点是你在包含的文件中有几个$ this,你不知道$ this的含义是什么类。仍然优于第一个解决方案。
第三种解决方案是使用Singleton模式。您只需要类模块的一个对象,它将为您防止许多麻烦。然后,您可以根据需要调用SetView(),而不会出现全局变量和未知范围的问题。您可以像这样调用SetView():module :: getInstance() - > SetView()。查看单例模式:https://duckduckgo.com/?q=singleton+pattern
答案 1 :(得分:0)
原因是,通过包含/要求一个文件,你可以完全相反地使用变量范围,而不是你期望的范围。有关更多信息,请查看PHP Documentation
这是一个例子,它非常清楚地表明:
vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
test.php的
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
?>