Interfejsy vs klasy abstrakcyjne
Założenie: Zrozumieć różnice i podobieństwa między interfejsami a klasami abstrakcyjnymi w PHP oraz kiedy stosować które rozwiązanie.
Krok po kroku:
- Interfejs: Zdefiniujmy prosty interfejs reprezentujący kształt geometryczny.
- Klasa implementująca interfejs: Stwórzmy klasę
Circle
implementującą interfejsShape
. - Klasa abstrakcyjna: Zdefiniujmy klasę abstrakcyjną
Animal
. - Klasa dziedzicząca po klasie abstrakcyjnej: Stwórzmy klasę
Dog
dziedziczącą po klasieAnimal
.
interface Shape {
public function getArea();
public function getPerimeter();
}
Ten kod definiuje interfejs Shape
z metodami getArea()
i getPerimeter()
. Klasy implementujące ten interfejs muszą zaimplementować te metody.
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function getArea() {
return pi() * $this->radius * $this->radius;
}
public function getPerimeter() {
return 2 * pi() * $this->radius;
}
}
Klasa Circle
implementuje metody zdefiniowane w interfejsie Shape
. Musimy zdefiniować metody getArea()
i getPerimeter()
dla koła.
abstract class Animal {
abstract public function makeSound();
public function eat() {
echo "Animal is eating\n";
}
}
Klasa Animal
jest abstrakcyjna, co oznacza, że nie można utworzyć jej instancji. Metoda makeSound()
jest abstrakcyjna i musi być zaimplementowana przez klasy dziedziczące.
class Dog extends Animal {
public function makeSound() {
echo "Woof!\n";
}
}
Klasa Dog
dziedziczy po klasie abstrakcyjnej Animal
i implementuje abstrakcyjną metodę makeSound()
.
Ten przykład pokazuje podstawowe różnice między interfejsami a klasami abstrakcyjnymi. Interfejsy definiują kontrakt, który klasy muszą spełnić, podczas gdy klasy abstrakcyjne pozwalają na częściową implementację i dziedziczenie.
Zachęcamy do dalszego zgłębiania tematu programowania obiektowego w PHP!