我唯一面向对象的编程经验来自C#,所以PHP给我一些曲线球我可以使用一些帮助。
我有一个我用于所有页面的课程,如果你愿意,我会使用“页面库”。它处理最低级别的html结构。该类由其他几个类继承。这些类是站点具有的不同页面类型。现在:我无法在继承它的类的实例中在“pagebase”中设置变量。在C#中,因为类实例的行为就像它是继承的类一样没有问题。
这是我所得到的代表:
pagebase.php
<?php
class pagebase
{
var $title = "No title";
var $body = "<center>No content</center>";
function setTitle($value) {
$this->title = $value;
}
function setBody($value) {
$this->title = $value;
}
function updateHTML()
{
...
}
function drawPage()
{
$this->updateHTML();
echo $this->html;
}
}
?>
std_page.php
<?php
include("includes/pagebase.php");
class std_page extends pagebase
{
function std_page()
{
...
}
function updateHTML()
{
parent::setBody(
"
<div id=\"main_wrapper\">
The page goes here!
</div>
"
);
}
function drawPage()
{
$this->updateHTML();
parent::drawPage();
}
}
?>
的index.php
<?php
include "includes/std_page.php";
$page = new std_page;
$page->setTitle("Avesta");
$page->drawPage();
?>
现在除此之外,这里最大的问题是没有工作。页面库中的值不会更改,即使我没有收到错误,表明找不到该功能或以任何形状,方式或形式运行。
有人请告诉我我做错了什么 - 谢谢
答案 0 :(得分:2)
首先,不要使用var
关键字声明您的媒体资源,请使用public
,private
或protected
定义其可访问性。
然后,当您想要从子类访问属性或方法时,只需使用$this
关键字。例如$this->title
,$this->setTitle('title')
当您使用static
运算符将属性或方法定义为静态时,会有::
个关键字。例如,如果您有public static $title
,则可以使用pagebase::$title
希望清楚一些混乱。
答案 1 :(得分:0)
这是parent
在静态范围内工作的情况,这就是您使用::
运算符的原因。
如果是继承,请尝试$this->setBody
。
答案 2 :(得分:0)
我做了一些更改以使代码运行并解决一些问题。它仍然不理想,但它应该起作用并具有指导性......
abstract class pagebase
{
private $title = 'No title';
private $body = 'No content';
public function setTitle($value) {
$this->title = $value;
}
public function setBody($value) {
$this->body = $value;
}
public function drawPage()
{
$this->updateHTML();
echo $this->body;
}
abstract protected function updateHTML();
}
class std_page extends pagebase
{
protected function updateHTML()
{
$this->setBody(
"
<div id=\"main_wrapper\">
The page goes here!
</div>
"
);
}
}
以下是更改:
pagebase
abstract,updateHTML
是一种抽象方法。渲染pagebase
没有意义,特定子类表达其个性的方式是创建自己的updateHTML
方法版本。 private
,这意味着外部代码(包括像std_page
这样的子类)无法修改或读取它们。如果子类需要访问权限,则可以使用protected
代替。可从任何地方访问的方法是public
。请参阅手册中的visibility。parent::
。只有当孩子有自己的实现覆盖父母,但你想明确地调用父版本时,才需要这样做。如果父方法做了一些实际工作,并且孩子想要构建它,这可能会有所帮助。请参阅this manual entry中的示例3。drawPage
的工作方式,则无需重新定义该方法。由于您正在超载updateHTML
,因此该重载版本会自动在drawPage
的现有实现中使用。 setBody
方法实际设置了您的title
,并且您在某些可能意味着$html
的地方使用了$body
。< / LI>