07. Основы ООП

Что такое ООП

ООП — это объектно-ориентированное программирование. Его цель — сделать код более понятным, гибким и логичным. Вместо кучи функций и переменных мы создаём объекты, которые описывают реальные вещи.
Представь, что ты создаёшь игру. У тебя есть класс «Игрок», у каждого игрока — имя, уровень и здоровье. Объекты — это конкретные игроки с разными параметрами.

Класс и объект

Класс — это шаблон, чертёж. Объект — это конкретный экземпляр класса.

<?php
class User {
  public $name;

function __construct($name) { $this->name = $name; // $this — это текущий объект }

function hello() { echo 'Привет, ' . $this->name . '!'; } }

$user1 = new User('Анна'); $user2 = new User('Иван');

$user1->hello(); // Привет, Анна! $user2->hello(); // Привет, Иван! ?>

Что делает конструктор

Метод __construct() вызывается автоматически при создании объекта. Он задаёт стартовые данные (например, имя пользователя).

Свойства и методы

  • Свойства — переменные внутри класса (характеристики объекта).
  • Методы — функции внутри класса (действия объекта).

Пример: класс «Автомобиль»


<?php
class Car {
  public $brand;
  public $speed;

function __construct($brand, $speed) { $this->brand = $brand; $this->speed = $speed; }

function drive() { echo $this->brand . ' едет со скоростью ' . $this->speed . ' км/ч'; } }

$car = new Car('Toyota', 120); $car->drive(); ?>

Результат:


Toyota едет со скоростью 120 км/ч

Модификаторы доступа

PHP поддерживает три типа видимости свойств и методов:
  • public — доступно отовсюду.
  • protected — доступно внутри класса и его потомков.
  • private — доступно только внутри самого класса.

Пример


class BankAccount {
  private $balance = 0;

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

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

$acc = new BankAccount(); $acc->deposit(1000); echo $acc->getBalance(); // 1000

Таким образом, мы защищаем данные от прямого изменения: нельзя сделать `$acc->balance = 9999;`.

Наследование

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

<?php
class User {
  public $name;
  function __construct($name) {
    $this->name = $name;
  }
  function hello() {
    echo 'Привет, ' . $this->name;
  }
}

class Admin extends User { function deleteUser($username) { echo 'Пользователь ' . $username . ' удалён.'; } }

$admin = new Admin('Анна'); $admin->hello(); // Привет, Анна $admin->deleteUser('Иван'); // Пользователь Иван удалён. ?>

Ключевое слово parent

Если в дочернем классе нужно вызвать конструктор родителя:

class Admin extends User {
  function __construct($name) {
    parent::__construct($name);
    echo ' (администратор)';
  }
}

Инкапсуляция

Это принцип, при котором объект «сам управляет» своими данными, а доступ извне ограничен.
Инкапсуляция — как капсула: вы можете взаимодействовать с ней через интерфейс, но не можете «влезть внутрь» напрямую.

Статические свойства и методы

Статические элементы принадлежат классу, а не конкретному объекту.

class Math {
  public static $pi = 3.14159;

public static function square($x) { return $x * $x; } }

echo Math::$pi; // 3.14159 echo Math::square(5); // 25

Практический пример: счётчик пользователей


class User {
  public static $count = 0;
  public $name;

public function __construct($name) { $this->name = $name; self::$count++; } }

$user1 = new User('Анна'); $user2 = new User('Иван');

echo 'Пользователей создано: ' . User::$count; // 2

Типичные ошибки новичков

  • Путают `$this` и `self` (это разные вещи!).
  • Забывают `new` при создании объекта.
  • Пытаются обратиться к `private` свойствам извне.
  • Забывают `parent::__construct()` при переопределении конструктора.

Практические задания

  • Создай класс `Book` с полями `title` и `author`. Добавь метод `info()`, который выводит строку: «Название: ... Автор: ...».
  • Создай класс `Library`, который хранит список книг в массиве и метод `showBooks()` для вывода их списка.
  • Добавь статическое свойство `Book::$count`, увеличивающееся при каждом создании книги.

Итоги урока

Теперь вы знаете:
  • Что такое классы, объекты, свойства и методы.
  • Как работает конструктор и модификаторы доступа.
  • Как использовать наследование и статические свойства.
  • Почему ООП делает код понятнее и удобнее для поддержки.