我有一个类似这样的抽象页面类:
abstract class Page {
public static function display() {
self::displayHeader();
self::displayContent();
self::displayFooter();
}
public static function displayContent() {
print "<p>some content</p>";
}
public static function displayHeader() {
include_once(kContent . "HeaderContent.class.php");
HeaderContent::display();
}
public static function displayFooter() {
include_once(kContent . "FooterContent.class.php");
FooterContent::display();
}
};
我想从中继承,并且只覆盖displayContent方法,因此页眉和页脚会自动显示,但仍然可以选择覆盖显示方法,例如.js文件。
现在我有另一个班级,看起来像这样:
class FooPage extends Page {
public static function displayContent() {
print "<p>Foo page</p>";
};
现在,它不是调用FooPage的displayContent
方法,而是从超类中调用它。
为什么呢?我该怎么办?
编辑
我正在运行PHP 5.2.17
答案 0 :(得分:7)
Ilija,PHP&lt; 5.3没有“Late Static Binding”这就是为什么你可能遇到FooPage::displayContent
未被调用的原因。如果您运行的是PHP 5.2,那么没有什么可做的(some hacks using debug_backtrace()除外,老实说我不建议这种情况)。
现在,它真正引起我注意的是你的方法都是静态的;是否有一个原因?他们为什么不是实例方法?我希望有类似的东西:
include_once(kContent . "HeaderContent.class.php");
include_once(kContent . "HeaderContent.class.php");
abstract class Page
{
protected $header;
protected $footer;
public function __construct()
{
$this->header = new HeaderContent();
$this->footer = new FooterContent();
}
public function display()
{
$this->displayHeader();
$this->displayContent();
$this->displayFooter();
}
public function displayContent()
{
print "<p>some content</p>";
}
public function displayHeader()
{
$this->header->display();
}
public function displayFooter()
{
$this->footer->display();
}
};
class FooPage extends Page
{
public function displayContent()
{
print "<p>Foo page</p>";
}
}
以后在您的视图中,您会写出类似的内容:
$page = new FooPage();
$page->display();
需要考虑的一些事项:
示例:
public function display()
{
return
$this->displayHeader() .
$this->displayContent() .
$this->displayFooter();
}
public function displayContent()
{
return "<p>some content</p>";
}
public function displayHeader()
{
return $this->header->display();
}
....
$page = new FooPage();
echo $page->display();
HTH