我在一个名为/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
的另一个类中实例化它,这可能会起作用。