SPL自动加载和扩展抽象类


SPL autoload and extending abstract classes

我在一个名为/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文件(位于/classes/目录中)实例化indexController时,我会得到以下错误:

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

它确定了$this->controller = new indexController($this->registry);是罪魁祸首。

__construct是受保护的,但indexController应该继承自baseController,因此,由于__construction方法没有被重新定义,它应该调用父类构造函数。或者我是这么想的。

到底发生了什么事?

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

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