我正在用PHP开发一个小的MVC框架进行练习。然而,PHP似乎不喜欢我的控制器类。该类包含一个加载视图的加载程序实例:
abstract class Controller
{
public $load;
function __construct($load)
{
$this->load = $load;
}
abstract public function index();
}
从那里,我可以覆盖所有控制器的控制器。对于 instace,我的索引控制器:
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';
}
}
问题出在这段代码上,而且并不总是很明显:
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 手册中找到深入的描述。
您需要实例化父类。
class Index extends Controller
{
public function __construct($load) {
parent::__construct($load);
}
public function index() {
$this->load->view("hello_world");
}
}