【问题标题】:How do i access a class instance's parent in PHP?如何在 PHP 中访问类实例的父级?
【发布时间】:2010-09-04 20:02:59
【问题描述】:

我唯一的面向对象编程经验来自 C#,所以 PHP 给了我一些曲线球,我可以使用一些帮助。

我有一个用于所有页面的类,如果你愿意的话,就是“pagebase”。它处理最低级别的 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();
?>

除其他外,这里最大的问题是没有任何作用。即使我没有收到任何错误指示该函数未找到或以任何形状、方式或形式运行,页面库中的值也不会更改。

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

【问题讨论】:

  • 我很困惑,你已经在使用parent::setBody。你为什么不使用 parent::setTitle ?您使用“旧式”PHP4 类定义有什么特别的原因吗?您是否注意到setBody 中出现复制和粘贴错误?
  • 您是通过 PHP 生成整个 HTML,然后回显或返回吗?我们最近在我们的项目中放弃了这种做法,因为它会导致许多困难 - 无法在 Dreamweaver 等代码编辑器中看到页面的布局视图,编辑器的 html 标记完成建议不起作用等。

标签: php inheritance function oop instance


【解决方案1】:

首先,切勿使用var 关键字声明您的属性,请使用publicprivateprotected 定义其可访问性。

那么当你想从子类中访问属性或方法时,你只需要使用$this关键字。例如$this-&gt;title$this-&gt;setTitle('title')

然后有 static 关键字,当您将属性或方法定义为静态时,您可以使用 :: 运算符调用它。例如,如果您有 public static $title,那么您可以使用 pagebase::$title 访问它

希望它能消除一些混乱。

【讨论】:

  • 这消除了困惑 :-) 感谢您的回复!
【解决方案2】:

这是parent 在静态范围内工作的情况,这就是您使用:: 运算符的原因。

如果是继承,就试试$this-&gt;setBody吧。

【讨论】:

    【解决方案3】:

    我进行了一些更改以使代码运行并修复一些问题。它仍然不理想,但它应该有效并且具有指导意义......

    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>
                "
            );
        }
    }
    

    以下是更改:

    • 我用updateHTML 做了一个抽象方法pagebaseabstract。渲染pagebase 是没有意义的,特定子类表达其个性的方式是创建自己的updateHTML 方法版本。
    • 我将你的内部变量设为private,这意味着外部代码(包括std_page 等子类)无法修改或读取它们。如果子类需要访问,您可以改用protected。那些可以从任何地方访问的方法是public。请参阅手册中的visibility
    • 在访问父级中定义的方法时,不需要parent::。仅当子级有自己的实现覆盖父级的实现时才需要这样做,但您想显式调用父级的版本。如果父方法做了一些真正的工作,而孩子想要以此为基础,这可能会有所帮助。请参阅this manual entry 中的示例编号 3。
    • 如果您不更改drawPage 的工作方式,则无需重新定义该方法。由于您正在重载updateHTML,因此该重载版本会自动用于drawPage 的现有实现中。
    • 我修复了一个复制和粘贴错误,其中您的 setBody 方法实际上设置了您的 title,而您在某些地方使用了 $html,而您在某些地方可能是指 $body

    【讨论】:

    • 正如我所提到的,我的问题中的代码只是我的问题的代表。我的 pagebase 类的大小很容易是我的表示的 20 倍,因此更正我的代码上的拼写错误是非常多余的。你提到的大部分更正都是在 Leonardys 指出我哪里想错之后我自己修正的。在阅读了一个有缺陷的教程后,我认为父类只能通过 parent:: 访问,这就是扩展类和父类都具有 updateHTML 函数的原因。 (注意:std_page.updateHTML 更新正文,而 pagebase.updateHTML 更新整个 HTML 文档)
    • 但是你的观点nr。 4 我不知道,所以谢谢你的回复。出于这个原因,我对你的回复投了赞成票:)
    猜你喜欢
    • 2019-03-17
    • 2021-11-07
    • 1970-01-01
    • 2011-02-21
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多