Що таке абстрактний клас у PHP?


121

Що таке абстрактний клас у PHP?

Як це можна використовувати?




6
@Gordon: Іноді офіційні документи для деяких людей не так зрозумілі :(
Сарфраз


3
@Sarfraz, що не означає RTFM-способом. Я просто думаю, що наявність посилання на офіційну документацію є корисним плюсом. І ви не повірите, скільки людей не читають офіційні документи або навіть знають, що вони існують.
Гордон

Відповіді:


131

Абстрактний клас - це клас, що містить принаймні один абстрактний метод, який є методом без фактичного коду в ньому, лише ім'я та параметри, який позначений як "абстрактний".

Мета цього - надати своєрідний шаблон для успадкування та змусити клас успадкування реалізувати абстрактні методи.

Таким чином, абстрактний клас - це щось середнє між звичайним класом і чистим інтерфейсом. Також інтерфейси - це окремий випадок абстрактних класів, де ВСІ методи абстрактні.

Дивіться цей розділ керівництва PHP для подальшої довідки.


6
У цій темі реферат не містить жодного абстрактного методу.
r0ng

6
@ r0ng Правильніше було б сказати, що абстрактний клас може містити абстрактні методи, а абстрактні методи завжди повинні бути всередині абстрактного класу. Визначальними практичними особливостями в моєму розумінні є те, що абстрактний клас неможливо встановити, але ви можете успадкувати і перезаписати методи, а статичні методи з абстрактного класу можна використовувати нормально.
okdewit

117

Абстрактні заняття - це заняття, які містять один або кілька абстрактних методів. Абстрактний метод - це метод, який оголошується, але не містить реалізації. Абстрактні класи можуть бути невідомими, і вони вимагають, щоб підкласи забезпечували реалізацію абстрактних методів.

1. Неможливо встановити абстрактний клас : класи, визначені як абстрактні, не можуть бути ідентифікованими, і будь-який клас, що містить принаймні один абстрактний метод, також повинен бути абстрактним.

Приклад нижче:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2. Будь-який клас, який містить принаймні один абстрактний метод, також повинен бути абстрактним : Абстрактний клас може мати абстрактні та неабразивні методи, але він повинен містити принаймні один абстрактний метод. Якщо клас має принаймні один абстрактний метод, то клас повинен бути оголошений абстрактним.

Примітка: ознаки підтримують використання абстрактних методів для того, щоб нав'язати вимоги до виставкового класу.

Приклад нижче:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

3. Абстрактний метод не може містити body : Методи, визначені як абстрактні, просто оголошують підпис методу - вони не можуть визначити реалізацію. Але неабразивний метод може визначити реалізацію.

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

4. При успадкуванні від абстрактного класу дитина повинна визначати всі методи, позначені абстрактним у декларації класу батьків : Якщо ви успадковуєте абстрактний клас, ви повинні надати реалізацію для всіх абстрактних методів у ньому.

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5. Однакова (або менш обмежена) видимість : при успадкуванні від абстрактного класу дитина повинна визначати всі методи, позначені абстрактним у декларації батьківського класу; крім того, ці методи повинні бути визначені з однаковою (або менш обмеженою) видимістю. Наприклад, якщо абстрактний метод визначений як захищений, реалізація функції має бути визначена як захищена або публічна, але не приватна.

Зауважте, що абстрактний метод не повинен бути приватним.

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6. Підписи абстрактних методів повинні відповідати : При успадкуванні від абстрактного класу дитина повинна визначати всі методи, позначені абстрактно в декларації батьківського класу; підписи методів повинні відповідати, тобто підказки типу та кількість необхідних аргументи повинні бути однаковими. Наприклад, якщо дочірній клас визначає необов'язковий аргумент, де підпис абстрактного методу не має, у підписі немає конфлікту.

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7. Абстрактний клас не підтримує множинне успадкування : Абстрактний клас може розширювати інший абстрактний клас, абстрактний клас може забезпечувати реалізацію інтерфейсу. Але він не підтримує множинне успадкування.

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

Примітка. Зверніть увагу, що порядок або розміщення класів у вашому коді може вплинути на інтерпретатора і може призвести до фатальної помилки. Тож, використовуючи кілька рівнів абстракції, будьте уважні до розміщення класів у вихідному коді.

нижче приклад призведе до фатальної помилки: Клас 'кінь' не знайдено

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());

1
Добре розроблений.
Talk2Nit

18

Абстрактний клас - це клас, який лише частково реалізується програмістом. Він може містити один або кілька абстрактних методів. Абстрактний метод - це просто визначення функції, яке служить сказати програмісту, що метод повинен бути реалізований у дочірньому класі.

Існує гарне пояснення того , що тут .


Привіт, дякую за пояснення, правда полягає в тому, що в Інтернеті не існує такого хорошого пояснення щодо абстрактного та інтерфейсного в PHP.
Ленін Запата

12

Абстрактний клас
1. Містить абстрактний метод
2. Неможливо безпосередньо ініціалізувати
3. Неможливо створити об’єкт абстрактного класу
4. Використовується лише для цілей успадкування

Абстрактний метод
1. Не може містити тіло
2. Не можна визначити приватним
3. Класи дитини повинні визначати методи, оголошені в абстрактному класі

Приклад коду:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

Вихід:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call

ви не можете викликати батьківський захищений метод об'єктом дочірнього класу, ви можете викликати метод дочірнього класу за допомогою цього об’єкта echo $ b-> test2 (). "<br/>";
Аль-Амін

7
  • Анотаційний клас містить лише підписи методу, вони не можуть визначити реалізацію.
  • Клас абстракції визначається за допомогою ключового слова реферат .
  • Абстрактний клас неможливий для здійснення багаторазового успадкування .
  • Остання версія PHP 5 представляє абстрактні класи та методи.
  • Класи, визначені як абстрактні, ми не можемо створити об'єкт (можливо, не інстанціювати)

0

Анотаційні класи - це класи, які неможливо ініціалізувати безпосередньо. Або іншим словом можна сказати, що абстрактні класи - це ті класи, об’єкт яких неможливо створити безпосередньо. У PHP абстрактні класи протиставлені ключовим словам абстрактно .

Також, щоб стати одним абстрактним класом ateast, один метод класу повинен бути абстрактним.

Докладно про абстрактний клас ви можете звернутися до мого блогу на абстрактному класі в PHP .


0

Абстрактний клас схожий на звичайний клас, він містить змінні, він містить захищені функції змінних, він містить конструктор, лише одне - інше, воно містить абстрактний метод.

Абстрактний метод означає порожній метод без визначення, тому лише однією різницею абстрактного класу ми не можемо створити об’єкт абстрактного класу

Анотація повинна містити абстрактний метод, і ці методи повинні бути визначені в його спадковому класі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.