Я создал один абстрактный класс и объявил две открытые функции и одну абстрактную функцию.
После этого я создал тело для публичной функции в абстрактном классе, но когда я расширил этот класс до другого класса, который тело метода не вызывает, тогда я хочу знать, как использовать открытые методы с классом тела.
<?php
//declare abstract class
abstract class Test {
// declare method 1 with body
public function method1()
{
echo "hello"; //what is use of this code here
}
public function method2()
{
$this->method3();
}
abstract public function method3();
}
//extended abstract class to another class
class AnotherTest extends Test{
public function method1(){
echo "5+9"/2;
}
public function method3(){
echo 2+9;
}
public function method2()
{
echo "just for testing";
}
}
$obj = new AnotherTest();
$obj->method1();
echo nl2br("\n");
$obj->method3(9,10);
echo nl2br("\n");
$obj->method2();
?>
Вообще говоря, вы бы не нормально override
каждый абстрактный метод. Если это так, то вы делаете что-то не так и нуждаетесь в рефакторинге.
Кроме того, наличие абстрактного (или любого расширенного класса) дает вам возможность вызывать parent::function()
что позволит запустить метод родителей, тогда вы можете сделать ваши текущие классы дополнительной логикой.
В конце концов, это является основой для Polymorphism
Простое объяснение: дочерний класс может расширять родительский класс, но действовать по-другому, изменяя поведение методов.
Прямо ваши «тесты» — просто плохие примеры, потому что в этих случаях вы правы, абстрактные тела почти бессмысленны.
Написание тела метода для метода базового класса обеспечивает поведение по умолчанию для этого метода на любых подклассах, которые не переопределяют метод.
Для любого (неfinal
) public
или же protected
Метод базового класса вы можете сделать одним из следующих:
parent::methodName()
в подклассеparent::methodName()
в подклассеОсновное преимущество кода, написанного таким образом, заключается в том, что он использует преимущества Полиморфизм отправлять вызовы универсальных методов для конкретных реализаций. Определение тела метода вместо того, чтобы оставлять его абстрактным, просто обеспечивает поведение по умолчанию. Поскольку это очень абстрактная концепция объектно-ориентированного программирования, сложно создать пример, который был бы простым и не тривиальным. Лучше всего взглянуть на популярные кодовые базы, такие как Laravel Framework или один из различных Компоненты Symfony для примеров этой концепции в действии.