ООП на PHP, что это? - Простым языком

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

Объект


Объекты в PHP довольно тривиальны по своему замыслу. Давайте к примеру возьмем зажигалку. Все же знают что такое зажигалка. В нашем случае зажигалка - это объект.
Но чтобы создать зажигалку, нам нужен чертёж зажигалки. Чертёж зажигалки - это класс в PHP.
Давайте сделаем чертеж зажигалки.
Сделаем в нашей зажигалке одну лишь вещь, которую она умеет - зажигаться.

Чертеж зажигалки - это класс:

    class Lighter { //создаем зажигалку
        public $status; //здесь будет статус, горит наша зажигалка или нет

        public function __construct() { //функция, которая вызывается при создании объекта
            $this->status = false; //при создании зажигалка не горит
        }

        public function fire() { //функция, при вызове которой зажигалка загорится
            $this->status = true; //меняем статус зажигалки на "горит"
        }
    }

А теперь, по этому чертежу, мы можем создавать зажигалки (объекты).

    $lighter1 = new Lighter(); //создаем одну зажигалку
    $lighter2 = new Lighter(); //создаем вторую зажигалку
    $lighter3 = new Lighter(); //создаем третью зажигалку

Теперь у нас есть три зажигалки, которые умеют гореть. Давайте зажжем вторую.

    $lighter2->fire(); //зажигалка теперь горит

Вторая зажигалка теперь горит, а остальные - нет.

Вот, собственно, главная вещь в ООП. С ней мы разобрались. Смысл ООП в том, что мы программируем не как обычно, а объектами. Всё объектами. Много объектов.
Зачем? Просто потому что жирные проекты поддерживать значительно проще придерживаясь ООП. Вы это поймёте. )

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


Вот допустим, нам нужна обычная зажигалка и зажигалка с фонариком. Что дальше? Создавать два класса?
Как вариант, но нет. ООП в PHP позволяет наследоваться. Родителем будет зажигалка без фонарика, а ребенком - зажигалка с фонариком. Как?

Все очень просто, для этого у нас есть extends. Сейчас всё поймёте.
Создаем чертеж зажигалки с фонариком, по мотивам обычной зажигалки:

    class LighterWithFlashlight extends Lighter { //создаем зажигалку с фонариком
        public $flashlight_status = false; //статус, горит фонарик или нет. Да, значение по умолчанию можно задавать здесь, без конструкта

        public function flashlight() { //функция, которая включает фонарик
            $this->flashlight_status = true; //меняем статус фонарика на "горит"
        }

    }

Теперь мы можем создать зажигалку с фонариком, имея чертеж зажигалки с фонариком.

    $lighter4 = new LighterWithFlashlight(); //создаем еще одну зажигалку
    $lighter4->flashlight(); //включаем фонарик
    $lighter4->fire(); //зажигаем зажигалку

Таким образом, у нас теперь есть три объекта, которые зажигалки. И один объект который зажигалка с фонариком.

Полиморфизм


Сложное слово, да? На самом деле, смысл у него простой. Смысл в том, что дочерний класс может перезаписывать что-то из родительского элемента.
На реальном примере:
Допустим, у нас есть зажигалка. Нам нужно сделать зажигалку с фонариком, но так, чтобы фонарик горел только когда горит сама зажигалка. Поняли? Горит зажигалка - горит и фонарик.

Создаём класс (чертеж):

    class LighterWithFlashlight extends Lighter { //создаем зажигалку с фонариком
        public $flashlight_status = false; //статус, горит фонарик или нет

        public function fire() { //функция, которая включает фонарик
            $this->status = true; //меняем статус зажигалки на "горит"
            $this->flashlight_status = true; //меняем статус фонарика на "горит"
        }
    }

Теперь, зажигая зажигалку, будет гореть и фонарик. Давайте создадим одну такую:

    $lighter5 = new LighterWithFlashlight(); //создаем еще одну зажигалку
    $lighter5->fire(); //зажигаем зажигалку

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


Еще одно сложное слово. Смысл его в том, что каждый объект может прятать внутри себя какие-нибудь функции или переменные от "внешнего" мира. Вот эта возможность "прятать" и называется инкапсуляцией.
Так же, прятать можно по-разному, давая разные уровни доступа. Давайте рассмотрим:

Уровень public


Слово "public" - это как лавочка на улице. Она публичная. Использовать могут все. Собственно, название говорит само за себя. Это публичный уровень, получить доступ можно из любого места. Из самого класса, из дочерних классов, при помощи кода извне - все могут менять и использовать.public!

Уровень protected


Уровень "protected" - это как семейный бюджет. Получить доступ к нему могут только члены определенной семьи. Только сам класс и его дочерние классы, никакого кода извне.

Уровень private


Уровень "private" - это как зубная щетка. Не даст использовать свои штуки как угодно. Доступ "private" разрешит использовать функцию или переменную ТОЛЬКО внутри класса. Только для себя. private - это личное.

Удаление объектов


Наверное, статья была бы неполной, если бы я в конце не уничтожил все эти зажигалки. Уничтожать объекты можно при помощи unset. Вот так:

    unset($lighter1,$lighter2,$lighter3,$lighter4,$lighter5);

Завершение


Нет, это далеко не весь ООП, а лишь поверхностное его представление. Имея такое представление уже можно примерно понять, как это работает и как изучать ООП в PHP дальше. :)