0

我正在尝试用 PHP 制作自己的简单框架。一切正常,但我遇到了问题。

我将所有内容重定向回我的 index.php,然后从那里开始加载类和函数。我将 url 分割成段,效果很好,直到我想在一个类中使用这些段。

我有一个像这样的主控制器类:

class SimpleController {
    
    public function __construct()
    {
        global $uri;
        print_r($uri);
    }
  }  

它可以很好地打印出 $uri 变量,但是当我为我的主页制作一个新控制器时,我会这样做:

class home extends SimpleController{

private $template = 'home'; // Define template for this page

public function __construct()
{
    parent::__construct();
}
    
public function index()
{        
    
 
   print_r($uri);
  $view = new View($this->template); // Load the template
     
}}

现在它给了我一个错误,未定义的变量。这怎么可能,因为我在父构造函数中使它成为全局的?

4

4 回答 4

2

不要在 PHP 中使用“全局”。只需在控制器中使用公共变量;

新代码:

abstract class SimpleController {
    public $uri;

    public function __construct($uri)
    {
        $this->uri = $uri;
    }
}

class home extends SimpleController{
    private $template = 'home'; // Define template for this page

    public function index()
    {
        $this->uri; //This is the URI
        $view = new View($this->template); // Load the template
    }
}

要创建您的控制器,只需使用:

$controller = new home();
$controller->uri = "URI";
$controller->index();

编辑:从家中删除了构造函数,当你想使用它时也传递 $uri.

于 2012-12-05T11:00:45.220 回答
1

那是一个糟糕的设计。你不应该依赖全局状态。而是在你家的 costructor 中传递 $uri 。

于 2012-12-05T11:00:02.147 回答
0

这怎么可能,因为我在父构造函数中使它成为全局的?

global $uri;这是一个新的作用域,所以如果你想访问它,你必须再次将它标记为全局( )。

但这是一个糟糕的设计,使用成员或类变量。

于 2012-12-05T11:00:54.690 回答
0

正如@yes123 所说,您的设计非常糟糕,您应该避免使用全局变量。否则,global当您想使用全局变量时,您需要在每个函数中使用,将您的代码更改为:

public function index()
{
  global $uri;       
  print_r($uri);
  $view = new View($this->template); // Load the template

}
于 2012-12-05T11:02:18.560 回答