索引中定义的变量无法访问

时间:2016-11-19 16:09:45

标签: php scope undefined

我有一个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

我不确定为什么?

2 个答案:

答案 0 :(得分:2)

在LoadController()内部不知道$ p,因为它在全局范围内。包含的控制器文件共享LoadController的范围。这就是您不能在控制器文件中使用$ call的原因。 有三种解决方案: 您可以在LoadController()中使用“global”关键字,因此$ Call在LoadController()和包含的控制器文件中是已知的:

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

?>