ООП в PHP принципы и примеры кода

ООП в PHP принципы и примеры кода

Современные крупные проекты не могут обойтись без объектно ориентированного программирования, которое дает гибкость и масштабируемость проекту. Так как большинство сайтов сделано на PHP мы рассмотрим именно ООП в PHP, которое даст проекту гибкость архитектуры посредством взаимодействия между class и method.

Что такое ООП в PHP

ООП (объектно-ориентированное программирование) — это парадигма, в которой всё строится вокруг объектов, объединяющих данные и функции работающие с ними.
На примере PHP ООП работает через классы, объекты, наследование, инкапсуляцию и полиморфизм.

Что такое CLASS на PHP

CLASS на PHP — это некий шаблон функционала, и по его подобию создаются объекты для работы с данными. Этот шаблон описывает какие свойства (переменные) и методы (функции) будут у объекта для осуществления различных операций.

<?php
class User {
    public $name; // свойство $name
    public $email; // свойство $email

    // Конструктор
    public function __construct($name, $email) {
        $this->name = $name; // передаем свойству $name данные из объекта
        $this->email = $email; // передаем свойству $email данные из объекта
    }

    // Метод класса
    public function introduce() {
        return "Привет! Меня зовут {$this->name}, мой email: {$this->email}";
    }
}

// Создание объекта класса User
$user = new User("IT шаман", "it_shaman@learn-top.ru");
echo $user->introduce();
?>

В коде выше мы создали класс с двумя свойствами для имени и email адреса, создали конструктор для принятия входящих данных, создали метод для возвращения информации с входящими данными. Разбор кода более детальней:

  • class User — объявления класса (создание).
  • $name и $email — свойства класса (переменные внутри класса).
  • __construct() — конструктор класса (вызывается самый первый при создании объекта).
  • $this — ссылка на текущий объект или свойству и методу внутри класса.
  • $user — объект вызываемого класса.

Принцип инкапсуляции ООП в PHP

Инкапсуляция — это ограничение доступа к методам и свойствам класса. Мы можем сделать доступ публичным указав public перед объявлением свойства или метода, private запретит обращение к этому свойству или методу вне класса (можно только внутри класса), protected разрешает доступ только внутри класса и его наследникам.

<?php
class BankAccount {
    private $balance = 0;

    public function deposit($amount) {
        $this->balance += $amount;
    }

    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(500);
echo $account->getBalance(); // 500
?>

Ограничение доступа нужно для того чтоб предотвратить какие либо изменения данных извне.

Принцип наследования ООП в PHP

Наследование позволяет на основе существующего класса создавать новый класс, наследуя тем самым его свойства и методы. Данный прием позволяет избежать дублирования кода и способствует расширению изначального функционала, класса родителя.

<?php
class Car {
    public $brand;
    public function drive() {
        echo "Машина {$this->brand} едет!";
    }
}

class ElectricCar extends Car {
    public $batteryLevel = 100;

    public function charge() {
        echo "Зарядка батареи... уровень: {$this->batteryLevel}%";
    }
}

$tesla = new ElectricCar();
$tesla->brand = "Tesla";
$tesla->drive();   // Машина Tesla едет!
$tesla->charge();  // Зарядка батареи...
?>

Наследование позволит вам не только принять свойства и методы родительского класса, но и создать свои, дополнив тем самым функционал.

Принцип полиморфизма ООП в PHP

Полиморфизм позволяет переопределять свойства и методы родительского класса, то есть, изменять их изначальную информацию на новую.

<?php
class Animal {
    public function sound() {
        echo "Животное издает звук.";
    }
}

class Dog extends Animal {
    public function sound() {
        echo "Собака лает.";
    }
}

class Cat extends Animal {
    public function sound() {
        echo "Кошка мяукает.";
    }
}

$animals = [new Dog(), new Cat(), new Animal()];

foreach ($animals as $a) {
    $a->sound();
    echo "<br>";
}
?>

Каждый объект будет выдавать разную информацию, хотя метод по большому счету один и тот же от родительского класса.

Interfaces (интерфейсы) в PHP

Интерфейсы это как шаблон для любого класса, который определяет какие какие методы наследуемый класс обязан содержать в себе.

<?php
interface Logger {
    public function log($message);
}

class FileLogger implements Logger {
    public function log($message) {
        file_put_contents("log.txt", $message . PHP_EOL, FILE_APPEND);
    }
}
?>

Это удобно, если задача подразумевает обязательные методы у разных классов.

Traits (трейты) в PHP

Trait — это возможность вставлять готовые методы в классы не используя наследования других классов. Либо использование наследования других классов, но как дополнение трейты могу давать отдельный функционал.

<?php
trait Timestamps {
    public function currentTime() {
        return date('Y-m-d H:i:s');
    }
}

class Post {
    use Timestamps;
}

$post = new Post();
echo $post->currentTime();
?>

Trait помогает избежать дублирования функционала между классами.

Итоги разработки ООП на PHP

Как уже следует понимать ООП на PHP это основа современной и профессиональной WEB разработки. Для более четкого понимания работы объектов, классов, свойств, методов и т.д. нужно просто больше практики. Создавая сложные web приложения с использованием ООП и всех его стандартов написания кода, вы не только себе облегчите доработку программы в будущем, но и вашим коллегам будет более понятно как работать с вашим кодом в будущем. Приводим наглядный пример в таблице:

Термин Описание Пример
Class Шаблон для создания объектов class User {}
Object Экземпляр класса $user = new User();
Property Переменная внутри класса public $name;
Method Функция внутри класса public function show() {}
Constructor Метод, вызываемый при создании объекта __construct()
Inheritance Наследование свойств и методов class Child extends Parent
Encapsulation Сокрытие данных private $data;
Polymorphism Переопределение методов function show() {}
Interface Задает контракт методов interface Logger {}
Trait Вставка общего кода use TraitName;