Co to jest klasa abstrakcyjna w PHP?


122

Co to jest klasa abstrakcyjna w PHP?

Jak można to wykorzystać?




6
@Gordon: Czasami oficjalne dokumenty nie są tak jasne dla niektórych ludzi :(
Sarfraz


3
@Sarfraz, który nie jest przeznaczony do RTFM. Myślę tylko, że posiadanie linku do oficjalnej dokumentacji jest pomocnym atutem. I nie uwierzyłbyś, ilu ludzi nie czyta oficjalnych dokumentów lub nawet nie wie, że istnieją.
Gordon

Odpowiedzi:


132

Klasa abstrakcyjna to klasa, która zawiera co najmniej jedną metodę abstrakcyjną, czyli metodę bez żadnego rzeczywistego kodu, tylko nazwę i parametry, i która została oznaczona jako „abstrakcyjna”.

Ma to na celu zapewnienie pewnego rodzaju szablonu do dziedziczenia i wymuszenia na klasie dziedziczącej implementacji metod abstrakcyjnych.

Klasa abstrakcyjna jest więc czymś pomiędzy klasą zwykłą a czystym interfejsem. Również interfejsy są szczególnym przypadkiem klas abstrakcyjnych, w których WSZYSTKIE metody są abstrakcyjne.

Więcej informacji znajdziesz w tej sekcji podręcznika PHP.


6
W tym wątku streszczenie nie zawiera żadnej metody abstrakcyjnej.
r0ng

6
@ r0ng Bardziej poprawne byłoby stwierdzenie, że klasa abstrakcyjna może zawierać metody abstrakcyjne, a metody abstrakcyjne muszą zawsze znajdować się wewnątrz klasy abstrakcyjnej. Praktyczne cechy, które definiuję w moim umyśle, to to, że nie można utworzyć instancji klasy abstrakcyjnej, ale można dziedziczyć i nadpisywać metody, a metody statyczne z klasy abstrakcyjnej mogą być normalnie używane.
okdewit

117

Klasy abstrakcyjne to klasy zawierające jedną lub więcej metod abstrakcyjnych. Metoda abstrakcyjna to metoda, która została zadeklarowana, ale nie zawiera implementacji. Nie można tworzyć instancji klas abstrakcyjnych i wymagają one, aby podklasy zapewniały implementacje metod abstrakcyjnych.

1. Nie można utworzyć instancji klasy abstrakcyjnej : nie można tworzyć instancji klas zdefiniowanych jako abstrakcyjne, a każda klasa zawierająca co najmniej jedną metodę abstrakcyjną musi być również abstrakcyjna.

Przykład poniżej:

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. Każda klasa, która zawiera co najmniej jedną metodę abstrakcyjną, musi być również abstrakcyjna : Klasa abstrakcyjna może zawierać metody abstrakcyjne i nieabstrakcyjne, ale musi zawierać co najmniej jedną metodę abstrakcyjną. Jeśli klasa ma co najmniej jedną metodę abstrakcyjną, wówczas klasa musi zostać zadeklarowana jako abstrakcyjna.

Uwaga: Cechy wspierają użycie metod abstrakcyjnych w celu narzucenia wymagań klasie, która je wystawia.

Przykład poniżej:

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. Metoda abstrakcyjna nie może zawierać treści : Metody zdefiniowane jako abstrakcyjne po prostu deklarują podpis metody - nie mogą definiować implementacji. Jednak implementację można zdefiniować za pomocą metody nieabstrakcyjnej.

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. W przypadku dziedziczenia z klasy abstrakcyjnej wszystkie metody oznaczone jako abstrakcyjne w deklaracji klasy rodzica muszą być zdefiniowane przez dziecko : Jeśli dziedziczysz klasę abstrakcyjną, musisz zapewnić implementacje dla wszystkich metod abstrakcyjnych w niej zawartych .

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. Taka sama (lub mniej ograniczona) widoczność : podczas dziedziczenia z klasy abstrakcyjnej wszystkie metody oznaczone jako abstrakcyjne w deklaracji klasy rodzica muszą być zdefiniowane przez dziecko; dodatkowo metody te muszą mieć taką samą (lub mniej ograniczoną) widoczność. Na przykład, jeśli metoda abstrakcyjna jest zdefiniowana jako chroniona, implementacja funkcji musi być zdefiniowana jako chroniona lub publiczna, ale nie prywatna.

Zauważ, że metoda abstrakcyjna nie powinna być prywatna.

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. Podpisy metod abstrakcyjnych muszą być zgodne : w przypadku dziedziczenia z klasy abstrakcyjnej wszystkie metody oznaczone jako abstrakcyjne w deklaracji klasy rodzica muszą być zdefiniowane przez dziecko, podpisy metod muszą być zgodne, tj. Podpowiedzi typu i liczba wymaganych argumenty muszą być takie same. Na przykład, jeśli klasa potomna definiuje opcjonalny argument, a podpis metody abstrakcyjnej go nie zawiera, nie ma konfliktu w podpisie.

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. Klasa abstrakcyjna nie obsługuje dziedziczenia wielokrotnego : Klasa abstrakcyjna może rozszerzać inną klasę abstrakcyjną. Klasa abstrakcyjna może zapewniać implementację interfejsu. Jednak nie obsługuje dziedziczenia wielokrotnego.

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

Uwaga: należy pamiętać, że kolejność lub położenie klas w kodzie może wpłynąć na interpreter i spowodować błąd krytyczny. Tak więc, używając wielu poziomów abstrakcji, uważaj na pozycjonowanie klas w kodzie źródłowym.

Poniższy przykład spowoduje błąd krytyczny: Nie znaleziono klasy „koń”

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
Dobrze opracowane.
Talk2Nit

18

Klasa abstrakcyjna to klasa, która jest tylko częściowo zaimplementowana przez programistę. Może zawierać jedną lub więcej metod abstrakcyjnych. Metoda abstrakcyjna to po prostu definicja funkcji, która służy do poinformowania programisty, że metoda musi zostać zaimplementowana w klasie potomnej.

Jest dobre wyjaśnienie, że tutaj .


Cześć, dzięki za wyjaśnienie, prawda jest taka, że ​​w internecie nie ma tak dobrego wyjaśnienia na temat abstrakcji i interfejsu w PHP.
Lenin Zapata

12

Klasa abstrakcyjna
1. Zawiera metodę abstrakcyjną
2. Nie można bezpośrednio zainicjować
3. Nie można utworzyć obiektu klasy abstrakcyjnej
4. Używane tylko do dziedziczenia

Metoda abstrakcyjna
1. Nie może zawierać treści
2. Nie może być zdefiniowana jako prywatna
3. Klasy potomne muszą definiować metody zadeklarowane w klasie abstrakcyjnej

Przykładowy kod:

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/>";

Wynik:

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

nie możesz wywołać metody chronionej przez rodzica przez obiekt klasy potomnej, możesz wywołać metodę klasy potomnej przez ten obiekt echo $ b-> test2 (). „<br/>”;
Al-Amin

7
  • Klasa abstrakcyjna zawiera tylko deklarację podpisu metody, nie mogą definiować implementacji.
  • Klasa abstrakcji jest definiowana za pomocą słowa kluczowego abstract .
  • Klasa abstrakcyjna nie może zaimplementować dziedziczenia wielokrotnego .
  • Najnowsza wersja PHP 5 wprowadza abstrakcyjne klasy i metody.
  • Klasy zdefiniowane jako abstrakcyjne, nie możemy utworzyć obiektu (nie można utworzyć instancji)

0

Klasy abstrakcyjne to te klasy, których nie można bezpośrednio zainicjować. Innymi słowy, możemy powiedzieć, że klasy abstrakcyjne to te, których obiektu nie można utworzyć bezpośrednio. W PHP klasy abstrakcyjne są chronione słowem kluczowym abstract .

Aby stać się jedną klasą abstrakcyjną, jedna metoda klasy musi być abstrakcyjna.

Szczegóły dotyczące klasy abstrakcyjnej można znaleźć na moim blogu na temat klasy abstrakcyjnej w PHP .


0

Klasa abstrakcyjna jest jak zwykła klasa zawiera zmienne zawiera zmienne chronione funkcje zawiera konstruktor tylko jedna rzecz jest inna zawiera metodę abstrakcyjną.

Metoda abstrakcyjna oznacza metodę pustą bez definicji, więc tylko z jedną różnicą w klasie abstrakcyjnej nie możemy stworzyć obiektu klasy abstrakcyjnej

Streszczenie musi zawierać metodę abstrakcyjną, a metody te muszą być zdefiniowane w klasie dziedziczącej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.