SPL自动加载和扩展抽象类

时间:2013-12-03 21:30:54

标签: php abstract-class spl-autoload-register

我在一个名为/ classes的目录中保留了一个抽象类定义。它看起来像这样:

abstract class baseController {

    protected $registry;

    //Obtain registry object
    protected function __construct($reg) {
        $this->registry = $reg;
    }

    protected function show() {

    }

}

在/ controllers /目录中(它们共享同一个父文件夹)我有我特定的控制器类文件。例如,

class indexController extends baseController {

    public function show() {

        //render index page
        $this->registry->view->render('index');

    }

}

我在配置脚本中使用两个spl_autoload_register()调用来确保在需要类时找到这两个目录 - 但是当我尝试从我的router.class.php文件(在/中)中实例化indexController时classes / directory)我收到以下错误:

PHP Fatal error:  Call to protected baseController::__construct() from context 'router'...

它确定了一行:$this->controller = new indexController($this->registry);作为罪魁祸首。

__construct受保护,但indexController应继承自baseController,因此,由于__construct方法未重新定义,应该调用父类构造函数。或者我想。

到底发生了什么事?

1 个答案:

答案 0 :(得分:2)

您应该在__construct方法中使用公共定义,因为您在类上下文之外实例化了类(例如在路由器类中)。

如果您在另一个扩展baseController的类中实例化它,这可能会有效。