Сегодня мы собираемся изучить, что такое абстрактный класс в PHP и как его использовать.

Несколько вещей, которые нам нужно знать об абстрактном классе.

  1. Абстрактный класс предоставляет шаблон или основу для любых подклассов, расширяющих абстрактный класс.
  2. Абстрактный класс никогда не может быть создан.
  3. У абстрактного метода нет кода, кроме подписи, и нет реализации, в этом главное различие между абстрактным и конкретным.
  4. Абстрактный метод является требованием или должен быть реализован для подкласса, расширяющего абстрактный класс.
  5. Абстракция — это модель объекта или явления реального мира, ограниченная конкретным контекстом, которая с высокой точностью представляет все детали, относящиеся к этому контексту, и опускает все остальное.

Теперь давайте поиграем с простым кодом.

abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    // Abstract method (no implementation)
    abstract public function makeSound();

    // Concrete method (has implementation)
    public function getName() {
        return $this->name;
    }
}

class Dog extends Animal {
    public function makeSound() {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function makeSound() {
        return "Meow!";
    }
}

// You cannot create an instance of the abstract class Animal
// $animal = new Animal("Generic Animal"); // This will result in an error

// Create instances of the concrete classes Dog and Cat
$dog = new Dog("Rex");
$cat = new Cat("Whiskers");

// Call methods on instances
echo $dog->getName() . " says " . $dog->makeSound() . "\n"; // Output: Rex says Woof!
echo $cat->getName() . " says " . $cat->makeSound() . "\n"; // Output: Whiskers says Meow!

Итак, вы видите, что если какой-либо класс, такой как Dog, Cat, расширяет класс Animal, должен реализовывать makeSound (абстрактный метод).

Если какой-либо подкласс не будет реализовывать абстрактный метод, возникнет ошибка.

Также вы видите, что мы не можем создать экземпляр абстрактного класса Animal. Если мы это сделаем, то снова получим ошибку.

Теперь давайте посмотрим пример реального кода.

// Abstract Report class
abstract class Report {
    protected $data;

    public function __construct($data) {
        $this->data = $data;
    }

    // Abstract method for generating the report
    abstract public function generateReport();

    // Concrete method for saving the report to a file
    public function saveReport($fileName) {
        $reportContent = $this->generateReport();
        file_put_contents($fileName, $reportContent);
        echo "Report saved to $fileName\n";
    }
}

// Concrete PDFReport class
class PDFReport extends Report {
    public function generateReport() {
        // Generate PDF report from $this->data and return it as a string
        $report = "PDF Report\n";
        $report .= "Data: " . implode(', ', $this->data);
        return $report;
    }
}

// Concrete CSVReport class
class CSVReport extends Report {
    public function generateReport() {
        // Generate CSV report from $this->data and return it as a string
        $report = "CSV Report\n";
        $report .= implode(',', $this->data);
        return $report;
    }
}

// Example usage
$data = [1, 2, 3, 4, 5];

$pdfReport = new PDFReport($data);
$pdfReport->saveReport('pdf_report.pdf');

$csvReport = new CSVReport($data);
$csvReport->saveReport('csv_report.csv');

Для получения более подробной информации о ООП (объектно-ориентированном программировании) вы можете перейти по ссылке, приведенной ниже. Не стесняйтесь оставлять комментарии, если у вас есть какие-либо отзывы или вопросы.

https://github.com/mohasin-dev/Object-Oriented-Programming-in-PHP