[英]How do i access a class instance's parent in PHP?
我唯一面向对象的编程经验来自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();
?>
现在除此之外,这里最大的问题是没有工作。 页面库中的值不会更改,即使我没有收到任何错误,表明找不到该功能或以任何形状,方式或形式运行。
有人请告诉我我做错了什么 - 谢谢
首先,不要使用var
关键字声明属性,请使用public
, private
或protected
定义其accesibilty。
然后,当您想要从子类访问属性或方法时,您只需要使用$this
关键字。 例如$this->title
, $this->setTitle('title')
当您将属性或方法定义为静态时,使用::
运算符调用它时,会有static
关键字。 例如,如果你有public static $title
那么你可以使用pagebase::$title
访问它
希望它清楚一些混乱。
这是parent
在静态范围内工作的情况,这就是你使用::
运算符的原因。
如果它是继承,只需尝试$this->setBody
。
我做了一些更改,以使代码运行并修复一些问题。 它仍然不理想,但它应该工作并具有指导性......
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
摘要 , updateHTML
是一个抽象方法。 这是没有意义的呈现pagebase
,和特定的子类表示个性的方法是通过创建它自己的版本updateHTML
方法。 std_page
private
,这意味着外部代码(包括像std_page
这样的子类)无法修改或读取它们。 如果子类需要访问权限,则可以使用protected
。 可从任何地方访问的这些方法都是public
请参阅手册中的可见性 。 parent::
。 只有当孩子有自己的实现覆盖父母,但你想明确地调用父版本时,才需要这样做。 如果父方法做了一些实际工作,并且孩子想要构建它,这可能会有所帮助。 请参阅本手册条目中的示例编号3。 drawPage
工作方式,则无需重新定义该方法。 由于您正在重载updateHTML
,因此该重载版本会自动在drawPage
的现有实现中drawPage
。 setBody
方法实际上设置了你的title
,你在一些地方使用$html
,大概你的意思是$body
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.