PHP'非对象'错误

Del*_*ake 4 php

我正在使用PHP中的一个小型MVC框架进行练习.但是,PHP似乎不喜欢我的Controller类.该类包含一个加载视图的加载器实例:

abstract class Controller
{
    public $load;
    function __construct($load) 
    {
        $this->load = $load;
    }
    abstract public function index();
}
Run Code Online (Sandbox Code Playgroud)

从那里,我可以覆盖所有控制器的控制器.对于instace,我的索引控制器:

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

但是当我创建它时:

require 'Controller.php';
require 'Load.php'
require 'controllers/Index.php';
$i = new Index(new Load());
$i->index();
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

你能帮助我吗?我知道我在构造函数中设置了load,而load类确实有一个名为view的方法,那为什么它会给我这个错误呢?另外:加载等级,只是为了好的措施

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

hak*_*kre 8

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

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

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

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

namespace DelishusCake;
Run Code Online (Sandbox Code Playgroud)

引入命名空间

这会自动修复您的问题.您需要将其放在文件的顶部.

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

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

要么:

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

重命名该课程

要么:

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

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

请记住,您只需要这个,因为它的名称相同.您可以构造函数和析构函数页面PHP手册中找到深入的描述.