Co to jest klasa abstrakcyjna w PHP?
Jak można to wykorzystać?
Co to jest klasa abstrakcyjna w PHP?
Jak można to wykorzystać?
Odpowiedzi:
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.
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());
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 .
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
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 .
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.