4

我正在使用 PHP 开发一个小型 MVC 框架以进行练习。然而,PHP 似乎不喜欢我的 Controller 类。该类包含一个加载视图的加载器实例:

abstract class Controller
{
    public $load;
    function __construct($load) 
    {
        $this->load = $load;
    }
    abstract public function index();
}

从那里,我可以覆盖我所有控制器的控制器。例如,我的索引控制器:

class Index extends Controller
{
    public function index()
    {
        $this->load->view("hello_world");
    }
}

但是当我创建它时:

require 'Controller.php';
require 'Load.php'
require 'controllers/Index.php';
$i = new Index(new Load());
$i->index();

我收到此错误:

PHP Fatal error:  Call to a member function view() on a non-object in /var/www/controllers/Index.php on line 7

你们能帮帮我吗?我知道我在构造函数中设置了负载,并且负载类确实有一个名为 view 的方法,那么为什么它会给我这个错误呢?另外:加载类,只是为了更好的衡量

class Load
{
    public function view($filename, $data = null)
    {
        if(is_array($data)) extract($data);
        include ROOT.DS.'views'.DS.$filename.'.php';
    }
}
4

2 回答 2

8

问题出在这段代码上,而且并不总是很明显:

class Index extends Controller
      ^^^^^
{
    public function index()
                    ^^^^^
    {
        $this->load->view("hello_world");
    }
}

这是相同的名称,因此是 PHP 4 向后兼容的构造函数。然后不调用、$load不设置父的构造函数并且不定义函数。

知道了这一点,有很多解决方案,包括:

namespace DelishusCake;

引入命名空间

这会自动解决您的问题。你需要把它放在文件的顶部。

class Index extends Controller
{
    public function index($load = NULL)
    {
        isset($load) && $this->load = $load;
        $this->load->view("hello_world");
    }
}

使 PHP4 向后兼容的构造函数工作

或者:

class MyIndex extends Controller
{
    public function index()
    {            
        $this->load->view("hello_world");
    }
}

重命名类

或者:

class Index extends Controller
{
    public function __construct($load) {
        parent::__construct($load);
    }
    public function index()
    {            
        $this->load->view("hello_world");
    }
}

添加一个 PHP 5 构造函数,调用父级的构造函数

请记住,您只需要它,因为它的名称相同。您也可以在PHP 手册的Constructors and Destructors页面上找到深入的描述。

于 2012-06-17T17:57:09.747 回答
2

您需要实例化父类。

class Index extends Controller
{
    public function __construct($load) {
      parent::__construct($load);
    }

    public function index() {
      $this->load->view("hello_world");
    }
}
于 2012-06-17T17:55:37.523 回答