Как вызывать функции родительского класса при расширении в дочернем классе - PullRequest
1 голос
/ 27 апреля 2020

Ниже приведен мой пример кода

<?php
Class A {
    function SelectRecord()
    {
        $this->DeleteRecord();
        echo "class A - SelectRecord ";
    }
    function DeleteRecord()
    {
        echo "class A - DeleteRecord ";
    }
}

Class B extends a {
    function SelectRecord()
    {
        Parent::SelectRecord();
        echo "class B - SelectRecord ";
    }
    function DeleteRecord()
    {
        echo "class B - DeleteRecord ";
    }
}

$objB = new B();
$objB->SelectRecord();

Вывод, который я получаю:

class B - DeleteRecord 
class A - SelectRecord 
class B - SelectRecord

Как я могу вызвать метод класса A DeleteRecord в самом классе A при расширении в классе B. Когда я пытался вызвать из класса A, он вызывает метод класса B DeleteRecord . Когда я использую self :: DeleteRecord. Работает нормально. Но когда это $ и Self. Должен ли я заменить $ this на Self, где бы он ни находился?

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете указать точный класс для вызываемого метода:

    <?php
    Class A {
        function SelectRecord()
        {
            A::DeleteRecord();
            echo "class A - SelectRecord ";
        }
        function DeleteRecord()
        {
            echo "class A - DeleteRecord ";
        }
    }

    Class B extends a {
        function SelectRecord()
        {
            Parent::SelectRecord();
            echo "class B - SelectRecord ";
        }
        function DeleteRecord()
        {
            echo "class B - DeleteRecord ";
        }
    }

    $objB = new B();
    $objB->SelectRecord();

results

class A - DeleteRecord 
class A - SelectRecord 
class B - SelectRecord 

Объяснение и дальнейшее чтение:

Механизм, который вызывает метод производного класса называется виртуальный метод . Используется для облегчения полиморфизма . Все методы в PHP являются виртуальными по умолчанию. Вы можете предотвратить переопределение метода, помечая его ключевым словом 'final'.

Как я понимаю, ваши классы не пытаются решить какую-либо практическую проблему, и это всего лишь упражнения по изучению языка. В 1015 * Effective Java:

есть замечательное руководство по использованию наследования в Joshua Bloch. Наследование подходит только в тех случаях, когда подкласс действительно является подтипом суперкласса. Другими словами, класс B должен расширять класс A только в том случае, если между двумя классами существует отношение «is-a». Если у вас возникнет желание расширить класс B на класс A, задайте себе вопрос: действительно ли каждый B является A? Если вы не можете правдиво ответить «да» на этот вопрос, B не должен расширять A. Если ответ «нет», часто бывает, что B должен содержать частный экземпляр A и предоставлять меньший и более простой API: A не является важной частью. B, просто деталь его реализации.

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