如何在PHP中访问类实例的父级?

时间:2010-09-04 20:02:59

标签: php inheritance function oop instance

我唯一面向对象的编程经验来自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();
?>

现在除此之外,这里最大的问题是没有工作。页面库中的值不会更改,即使我没有收到错误,表明找不到该功能或以任何形状,方式或形式运行。

有人请告诉我我做错了什么 - 谢谢

3 个答案:

答案 0 :(得分:2)

首先,不要使用var关键字声明您的媒体资源,请使用publicprivateprotected定义其可访问性。

然后,当您想要从子类访问属性或方法时,只需使用$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 abstractupdateHTML是一种抽象方法。渲染pagebase没有意义,特定子类表达其个性的方式是创建自己的updateHTML方法版本。
  • 我创建了内部变量private,这意味着外部代码(包括像std_page这样的子类)无法修改或读取它们。如果子类需要访问权限,则可以使用protected代替。可从任何地方访问的方法是public。请参阅手册中的visibility
  • 访问父级中定义的方法时,您不需要parent::。只有当孩子有自己的实现覆盖父母,但你想明确地调用父版本时,才需要这样做。如果父方法做了一些实际工作,并且孩子想要构建它,这可能会有所帮助。请参阅this manual entry中的示例3。
  • 如果您没有更改drawPage的工作方式,则无需重新定义该方法。由于您正在超载updateHTML,因此该重载版本会自动在drawPage的现有实现中使用。
  • 我修复了一个复制粘贴错误,其中setBody方法实际设置了您的title,并且您在某些可能意味着$html的地方使用了$body。< / LI>