Объектно-ориентированное программирование в PHP
Объектно-ориентированное программирование (ООП) – это одна из ключевых парадигм программирования, позволяющая организовывать код в виде объектов. В PHP ООП реализовано через классы, объекты, наследование, полиморфизм и инкапсуляцию. Начиная с версии PHP 8, появились дополнительные возможности, такие как default-методы в интерфейсах.
Основные принципы ООП в PHP
1. Классы и объекты
Класс – это шаблон, по которому создаются объекты. Объект – это экземпляр класса.
class Car {
public $brand;
public function drive() {
echo "Driving...";
}
}
$car = new Car();
$car->brand = "Toyota";
echo $car->brand;
$car->drive();
2. Инкапсуляция
Инкапсуляция позволяет скрывать внутреннюю реализацию объекта, ограничивая доступ к его свойствам и методам.
class BankAccount {
private $balance = 0;
public function deposit($amount) {
$this->balance += $amount;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();
3. Наследование
Наследование позволяет одному классу заимствовать свойства и методы другого.
class Vehicle {
public function start() {
echo "Starting the engine...";
}
}
class Car extends Vehicle {
public function honk() {
echo "Beep beep!";
}
}
$myCar = new Car();
$myCar->start();
$myCar->honk();
4. Полиморфизм
Полиморфизм позволяет использовать один интерфейс для разных типов объектов.
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
echo "Logging to file: $message";
}
}
class DatabaseLogger implements Logger {
public function log($message) {
echo "Logging to database: $message";
}
}
function writeLog(Logger $logger, $message) {
$logger->log($message);
}
writeLog(new FileLogger(), "Error 404");
writeLog(new DatabaseLogger(), "Error 500");
Абстрактные классы и интерфейсы
Абстрактный класс – это класс, который нельзя создать напрямую. Он служит как шаблон для других классов.
abstract class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
abstract public function makeSound();
}
class Dog extends Animal {
public function makeSound() {
return "Bark!";
}
}
$dog = new Dog("Buddy");
echo $dog->makeSound();
Интерфейсы определяют контракты для классов, но не содержат реализацию методов.
interface Swimmable {
public function swim();
}
class Fish implements Swimmable {
public function swim() {
echo "Swimming...";
}
}
$fish = new Fish();
$fish->swim();
Использование default-методов в интерфейсах (PHP 8+)
С PHP 8 интерфейсы могут содержать методы с реализацией.
interface Logger {
public function log($message);
public function formatMessage($message) {
return "[LOG]: " . strtoupper($message);
}
}
class FileLogger implements Logger {
public function log($message) {
echo $this->formatMessage($message);
}
}
$logger = new FileLogger();
$logger->log("message received");
SOLID-принципы в ООП
- S - Принцип единственной ответственности (SRP)
Класс должен отвечать только за одну задачу.
class User {
public function register($email) {
// логика регистрации
}
}
class Mailer {
public function sendEmail($email) {
// логика отправки письма
}
}
- O - Принцип открытости/закрытости (OCP)
Классы должны быть открыты для расширения, но закрыты для изменения.
interface PaymentMethod {
public function pay();
}
class PayPal implements PaymentMethod {
public function pay() {
echo "Paid via PayPal";
}
}
class Stripe implements PaymentMethod {
public function pay() {
echo "Paid via Stripe";
}
}
function processPayment(PaymentMethod $payment) {
$payment->pay();
}
processPayment(new PayPal());
processPayment(new Stripe());
- L - Принцип подстановки Лисков (LSP)
Дочерний класс должен заменять родительский без изменения поведения.
abstract class Bird {
abstract public function move();
}
class Sparrow extends Bird {
public function move() {
return "Flying...";
}
}
class Penguin extends Bird {
public function move() {
return "Swimming...";
}
}
Полезные ссылки
- Официальная документация PHP по ООП
- SOLID-принципы в PHP
- Статья о паттернах проектирования в PHP
- Нововведения PHP 8
Этот материал охватывает ключевые аспекты ООП в PHP. Если у вас есть вопросы или идеи для дальнейшего изучения, пишите в комментариях.