PHP Manual

Вступ до об'єктно-орієнтованого програмування на PHP

01. 01. 2020

Ласкаво просимо до першої статті онлайн-курсу ООП в PHP. З повним переліком статей можна ознайомитися на сторінці огляду.

Змістові примітки:

Мета цієї серії - якнайкраще пояснити суть об'єктно-орієнтованого програмування, щоб вам не довелося витрачати сотні годин на експерименти над речами, які не мають сенсу. Всі методики та підручники взяті з практики і пояснюються так, як я сам хотів би їх прочитати, коли вчився програмувати. Деякі поняття сильно спрощені за рахунок 100% фактичної правильності, тому що я вважаю, що завжди краще розуміти в основному принципи і мати хоч якесь уявлення про проблеми, ніж заплутатися в програмуванні і бачити все як один великий бардак.

Як ви незабаром побачите, програмування на ООП має величезні переваги для вашого коду. Це виведе на новий рівень абстракції над вашим додатком і дозволить вирішувати дуже складні завдання, які не були б можливі в інший спосіб.

Що таке об'єкти

В базовому понятті програмування об'єкти - це спеціальні типи даних, які, окрім власного значення, можуть детально визначати стан, методи, поведінку та дозволяють виконувати різні операції, як в реальному світі.

Об'єкт у програмуванні - це щось на зразок реальної "речі", яку ми можемо назвати (наприклад, іменником) і яка має властивості, подібні до властивостей реальної речі. Наприклад, об'єктом може бути стаття, яка має деякі значення (назва, зміст, автор, дата публікації, ...) та методи (вставити нову назву, прочитати зміст, підрахувати кількість днів з моменту публікації, ...). У цій статті ми в основному розглянемо, як створювати і працювати з об'єктом на базовому рівні.

Об'єкти та класи

Як ми вже з'ясували, об'єкт - це те, що існує. Слово "існує" є дуже важливим на даному етапі, тому що, як ми незабаром побачимо, ще є практична імплементація, з якою потрібно мати справу в програмуванні.

Оскільки в програмуванні ми пишемо код, а об'єкт - це щось "живе", то з цього моменту ми будемо розрізняти два різних поняття, де важливо детально розуміти значення і чітко розмежовувати їх:

  • Об'єкт** - це щось "живе", що існує прямо зараз (має екземпляр), і може щось виконувати або реагувати на інші об'єкти.
  • Клас** - це статично написаний код, який ще не оцінювався і залишається незмінним весь час.

Оскільки при програмуванні ми завжди пишемо код у вигляді статичного рядка (тексту), то будемо розрізняти програми на "класи" (статичне визначення всього об'єкта) і "об'єкти" ("живий" екземпляр класу).

Приклад опису класу:

class Article
{
public string $title;
public ?string $autor = null;
}

Практичні рекомендації:.

У реальному додатку кожен клас зазвичай записується в окремий PHP-файл, який називається так само, як і ім'я класу.

Так для класу Article, наприклад, створюємо файл rc/Article.php. Ця угода не є обов'язковою в PHP, але вона допомагає зробити додаток більш читабельним, щоб не мати багато коду в одному місці.

Кожен клас може існувати не більше одного разу у всьому додатку (мати унікальне ім'я), але екземплярів може бути (майже) нескінченно багато (в залежності від об'єму оперативної пам'яті). Крім того, один клас не може бути розділений на декілька файлів і повинен бути визначений в одному місці відразу. Якщо потрібно створити декілька класів з однаковими іменами, використовуйте простори імен.

Пізніше ми також покажемо, що добре структурований код дозволить повторно використовувати його в багатьох проектах.

У цьому коді визначено клас Article з двома властивостями (title і author). PHP ігнорує коментарі і використовує їх тільки для статичної перевірки типів (зазвичай зчитується PhpStorm).

Код:

public string $title;

означає визначення "властивості", що є властивістю класу "Стаття". Ми можемо уявити це так, що "стаття" є своєрідним полем, а "заголовок" - його індексом, в який ми можемо записати значення. Кожна властивість повинна мати визначений доступ ("публічний", "захищений" або "приватний"), пізніше ми пояснимо, що означає кожне налаштування. Якщо ви не знаєте, яку доступність обрати в конкретному випадку, ставте "публічну".

Екземпляр класу та створення об'єкту

Поняття "випадок" є одним з найскладніших для розуміння, тому важливо, щоб Ви дуже уважно прочитали наступні рядки, і я рекомендую Вам спробувати розібратися з усіма прикладами.

Якщо в нашому додатку вже є клас, визначений у вихідному коді, то він реально ніде не використовується і PHP про нього не знає. Це пов'язано з тим, що ООП вводить "принцип інкапсуляції даних", який означає, що клас має внутрішній (локальний) контекст, який дійсний тільки всередині класу. Це пов'язано з тим, що в безоб'єктній розробці ми звикли завжди оцінювати код повністю. Також спробуйте думати про клас як про деяку форму функції або програми, що викликається ззовні.

Тепер ми можемо створити наш перший екземпляр, використовуючи для цього оператор new.

$myArticle = new Article;
$myArticle->title = 'Моя перша стаття'; // записує значення
echo $myArticle->title; // перераховує "Мою першу статтю"

Зверніть увагу, що у змінну $myArticle ми помістили весь об'єкт Article, створений оператором new. Для нас це означає, що об'єкт фактично є "типом даних", тому ми можемо переміщати його через змінні і продовжувати працювати з ним.

Для маніпулювання об'єктом використовується оператор зі стрілкою ->. Якщо у нас є екземпляр певного об'єкту (у нас є змінна з його вмістом), ми можемо легко записувати значення у внутрішні властивості, або читати їх чи змінювати різними способами за допомогою методів (побачимо пізніше).

Екземпляр об'єкту - це створення локальної "живої" копії класу в пам'яті (змінної).**.

Одночасне створення декількох екземплярів одного класу

Як ми вже обговорювали, кожен об'єкт має місцевий контекст, який діє в його внутрішньому середовищі. Завдяки цьому принципу ми можемо створювати багато незалежних екземплярів одного класу і вільно маніпулювати ними. Можна навіть створити динамічну кількість екземплярів і, наприклад, зберігати їх як елементи масиву. Можливості безмежні.

Попередження:**.

При створенні екстремальної кількості екземплярів (сотні і більше) пам'ятайте про обсяг пам'яті, оскільки PHP повинен зберігати інформацію про всі екземпляри в оперативній пам'яті. Однак на практиці проблема переповнення пам'яті через велику кількість екземплярів не виникає.

Приклад:

$firstArticle = new Article;
$firstArticle->title = 'Моя перша стаття';
$secondArticle = new Article;
$secondArticle->title = 'Про собаку і кота';
echo $firstArticle->title; // перераховує "Мою першу статтю"
echo $secondArticle->title; // виписує "Про собаку і кота"

Зверніть увагу, що лістинг властивості title (->title) залежить від того, з якого екземпляру ми читаємо.

Резюме

Ми показали, як визначити наш перший клас і створити його екземпляр (об'єкт), в який ми записали декілька значень.

У наступній частині ми пояснимо поняття Конструктор, методи та передача вводу.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024