Как я могу получить доступ к родителю экземпляра класса в PHP? - PullRequest
3 голосов
/ 05 сентября 2010

Единственный объектно-ориентированный опыт, который у меня есть, связан с C #, поэтому PHP бросает мне несколько кривых шаров, с которыми я мог бы помочь.

У меня есть класс, который я использую для всех своих страниц, - pagebase" если вы будете.Он обрабатывает HTML структуру самого низкого уровня.Этот класс наследуется несколькими другими классами.Эти классы относятся к разным типам страниц сайта.Теперь: у меня проблемы с установкой переменной в "базе страниц" из экземпляра класса, который ее наследует.В 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 ]

2 голосов
/ 05 сентября 2010

Прежде всего, никогда не объявляйте свои свойства с помощью ключевого слова var, определите его доступность, используя public, private или protected.

Затем, когда вы хотите получить доступ к свойствам или методу из дочернего класса, вам просто нужно использовать ключевое слово $this. например, $this->title, $this->setTitle('title')

Тогда есть ключевое слово static, когда вы определяете свойство или метод как статический, который вызывается с помощью оператора ::. например, если у вас есть public static $title, вы можете получить к нему доступ, используя pagebase::$title

Надеется, что это прояснит некоторую путаницу.

0 голосов
/ 05 сентября 2010

Я внес некоторые изменения, чтобы заставить код работать и исправить некоторые проблемы.Это все еще не идеально, но оно должно работать и быть поучительным ...

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.
  • Я сделал ваши внутренние переменные private, что означает, что внешний код (включая дочерние классы, такие как std_page) не может изменять или читать их.Если дочерним классам нужен доступ, вы можете использовать protected.Эти методы доступны из любого места: public.См. visibility в руководстве.
  • При доступе к методам, определенным в родительском элементе, вам не нужно parent::.Это требуется только тогда, когда у ребенка есть собственная реализация, которая переопределяет родительскую, но вы хотите явно вызвать версию родителя.Это может быть полезно, если родительский метод выполняет какую-то реальную работу, и ребенок хочет использовать это.См. Пример № 3 в этой ручной записи .
  • Если вы не меняете принцип работы drawPage, нет необходимости переопределять метод.Поскольку вы перегружаете updateHTML, эта перегруженная версия автоматически используется в существующей реализации drawPage.
  • Я исправил ошибку копирования и вставки, когда ваш метод setBody фактически установил ваш title, и вы использовали $html в некоторых местах, где вы предположительно имели в виду $body.
0 голосов
/ 05 сентября 2010

Это случай parent, работающий в статической области видимости, поэтому вы используете оператор ::.

Если это наследование, попробуйте, например, $this->setBody.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...