簡體   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