繁体   English   中英

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

[英]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关键字声明属性,请使用publicprivateprotected定义其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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM