这个问题经过多次询问,但这些答案似乎都不适用于此。
我有以下PageBase
课程:
<?php
class PageBase {
public $templatefile = '404';
function Before() {}
function After() {}
function Display() {
$smarty = System::GetSmarty();
$smarty->display('views/'.$this->templatefile.'.tpl');
}
function Run() {
self::Before();
self::Display();
self::After();
}
}
所有这个课程的目的都是为我的其他页面提供基础;这些页面可能需要或不需要在显示页面之前/之后运行自己的代码,并且它们通常具有自己的$templatefile
。例如我的Home
类;
<?php
class Home extends PageBase {
public $templatefile = 'home';
function Before() {
var_dump($_REQUEST);
}
function After() {}
}
我遇到的问题是加载了正确的模板文件(home
),但Home::Before()
中的代码未通过实例化的$home->Before()
运行,{而是运行{1}}。
解决这个问题的正确方法是什么? PHP是否提供了覆盖父函数的任何方法?
亲切的问候
答案 0 :(得分:1)
就个人而言,我会使用一个接口来统一,并在设置变量后调用父,如下所示:
<?php
Interface PageBase {
public function Before();
public function After();
public function Display();
public function Run();
}
class Page Implements PageBase {
public $templatefile = '404';
function Before() {}
function After() {}
public function Set($page) {
if (class_exists($page)) {
$class = new $page($page);
return $class;
}
return false;
}
function Display()
{
$smarty = System::GetSmarty();
$smarty->display('views/' . $this->templatefile . '.tpl');
}
function Run()
{
self::Before();
self::Display();
self::After();
}
}
class Home extends Page Implements PageBase
{
public $templatefile = 'home';
function After() { parent::After(); }
function Display() { parent::Display(); }
function Run() { parent::Run(); }
function Before() {
var_dump($_SERVER);
}
}
$Page = new Page(); //Create a new page instance for all of the functionality
$home = $Page->Set("Home"); //Returns a new class of Home
$home->Display(); //Displays the templatefile "home"
我希望这会有所帮助。