这应该很容易..有人可以解释一下我的语法吗?
我有一个控制器,它实例化一个实例化配置类的引导类(new keyword)。
然后,控制器实例化一个扩展引导类的起始类。在startpage类中,我试图访问bootstrap(父)类中的配置对象。甚至可以这样做吗?或者startpage是否必须直接实例化bootstrap?是否实例化扩展bootstrap的startpage,覆盖bootstrap?或者我的语法错了?
控制器(索引页)
try {
if (!include($paths['root'] . $paths['framework'] . '/core/AutoLoader.php')) {
throw new Exception ('<b>Error - AutoLoader is missing</b>');
}
$loader = new AutoLoader($paths);
$appStack = new BootStrap($paths);
$app = new StartPage();
$app->start();
} catch (Exception $e) {
echo
'<p><b>EXCEPTION</b><br />Message: '
. $e->getMessage()
. '<br />File: '
. $e->getFile()
. '<br />Line: '
. $e->getLine()
. '</p>';
}
Bootstrap类:
class BootStrap {
protected $config;
/**
* --------------------------------------------------------------------------
** GETTERS
* --------------------------------------------------------------------------
*
*/
public function getConfig() { return $this->config; }
/**
* --------------------------------------------------------------------------
* __construct()
* PUBLIC method
* = Starts a new session, loads stylesheets, loads classes
* --------------------------------------------------------------------------
*
*/
public function __construct($paths) {
/**
* --------------------------------------------------------------------------
* load Config class
* --------------------------------------------------------------------------
*
*/
try {
if (!class_exists('Config')) {
throw new Exception ('<b>Error - Configuration class is missing</b>');
}
$this->config = new Config();
} catch (Exception $e) {
echo
'<p><b>EXCEPTION</b><br />Message: '
. $e->getMessage()
. '<br />File: '
. $e->getFile()
. '<br />Line: '
. $e->getLine()
. '</p>';
}
}
}
Startpage类:
class StartPage extends BootStrap {
/**
* --------------------------------------------------------------------------
* __construct()
* PUBLIC method
* = Starts a new session, loads stylesheets, loads classes
* --------------------------------------------------------------------------
*
*/
public function __construct() {
}
/**
* --------------------------------------------------------------------------
* Start()
* PUBLIC method
* = loads the web page
* --------------------------------------------------------------------------
*
*/
public function Start() {
// path to includes
$inc_path = $this->paths['root'] . $this->paths['medium'];
// instantiate page, html header
$charset = $this->config->getCharset();
$title = $this->config->getTitle();
$description = $this->config->getDescription();
}
}
答案 0 :(得分:2)
只要您使用StartPage
自己的__construct()
方法,就可以有效地“隐藏”Bootstrap
中的那个,完全覆盖它。因此,$foo = new StartPage()
仅运行__construct()
类的StartPage
代码。
为了在__construct()
父类中运行Bootstrap
代码,您必须使用parent::__construct()
添加对它的显式调用。
如果您想知道为什么PHP不会为您执行此操作,如果它是自动的,则有三件事您无法做到:
parent::__construct()
,在之前和之后运行代码。 编辑:为了总结下面的进一步说明,创建父(Bootstrap
)类的特定实例不会对同一类的其他实例的后续创建产生任何影响或它的子类(StartPage
);每个都是一个单独的对象,将独立调用__construct
。
如果您希望多个StartPage
对象引用Bootstrap
类的一个特定实例,则继承不是正确的机制。相反,您需要通过某种形式的依赖注入将创建的Bootstrap
实例传递到每个StartPage
实例。
答案 1 :(得分:0)
尝试实现Child Class的构造函数,并显式调用父类的构造函数。
public function __construct() {
parent::__construct();
}
答案 2 :(得分:0)
在StartPage中:
protected $config;
public function __construct()
{
$this->config = $this->getConfig();
}
或者,按照xelber的回答,使用parent::__construct();