ООП в php класи, екземпляри класу, поля, методи і конструктори, блог веб-розробників

ООП в php класи, екземпляри класу, поля, методи і конструктори, блог веб-розробників
Як ви дізналися з попередньої статті. клас являє собою опису деяких схожих між собою об'єктів. У цій статті ми детально на прикладах розглянемо, як саме описуються дані, які буде зберігати екземпляр класу, і його поведінка, тобто методи.







Опис класу та створення його примірника

Опис класу в PHP починається з ключового слова class. Після нього слід ім'я класу. Називати класи прийнято з великої літери. Після імені класу в фігурних дужках слід опис членів класу - його полів (даних) і методів.

Створення екземпляра класу нічим не відрізняється від запису результату роботи функції в змінну, за винятком використання ключового слова new.

$ ЕкземплярКласса = new ІмяКласса ();

поля класу

При описі полів класу потрібно вказувати специфікатор доступу - ключове слово, яке буде визначати область видимості поля, до якого воно відноситься. В php є три специфікатор доступу: public. protected і private. Специфікатор public забезпечує доступ до поля з будь-якого місця, protected - тільки з класів стоять в тій же ланцюжку спадкування (з класу-нащадка, з нащадка нащадка і т.д.) і private забороняє доступ з усіх усюд, крім самого класу. Після специфікатор доступу йде ім'я поля, предварённое знаком долара.

Ми не будемо детально розглядати цей синтаксис, як застарілий, але знати про нього потрібно, оскільки за часів, коли старі версії php були актуальні, було написано неймовірне кількість коду і він до сих використовується в багатьох проектах. При такому синтаксисі поля класу доступні ззовні, як якщо б вони були оголошені зі специфікатором доступу public.

Для доступу до полів класу використовується символ '->'. Ім'я поля, до якого ми хочемо звернутися пишеться без знака долара. Поля доступні ззовні класу в цьому випадку, тому що ми використовуємо специфікатор доступу public.

$ User = new User (); $ User-> login = 'true-coder'; $ User-> password = 'qwerty'; echo "Логін: $ user-> login
". // Логін: true-coder" Пароль: $ user-> password "; // Пароль: qwerty

Значення полів класу за замовчуванням - null:

$ User = new User (); echo "Логін:" .getType ($ user-> login). "
". // Логін: NULL" Пароль: ".getType ($ user-> password); // Пароль: NULL

В php допустимо звертатися до поля, ім'я якого міститься в строкової змінної:

$ User = new User (); $ PropertyName = 'login'; $ User -> $ propertyName = 'true-coder'; $ PropertyValue = $ user -> $ propertyName; echo "$ propertyName: $ propertyValue"; // login: true-coder

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

Звернення до неіснуючого полю (властивості) в PHP не викликає помилки і, якщо присвоїти такому полю значення, то воно збережеться в екземплярі об'єкта. Такі поля або властивості називають динамічно обумовленими.

$ P = new Point (); $ P-> z = 10; echo "z: $ p-> z"; // z: 10

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







На практиці такий код, як в классаx User або Point не прийнятний. Доступ до полів класу, за рідкісним винятком, необхідно здійснювати посредствам методів, а самі поля робити недоступними за межами класу або ланцюжка успадкування. Крім того незручно присвоювати значення полях уже після створення об'єкта.

методи класу

Як я говорив раніше, методи описують поведінки примірників класу, тобто дії, які вони можуть здійснювати. Описи методу в класі, як і опис поля, починається зі специфікатор доступу, потім слід ключове слово function. ім'я методу і список параметрів в круглих дужках. Усередині методу доступ до поточного екземпляру класу можна отримати за допомогою ключового слова $ this. яке, на відміну від багатьох інших мов програмування, в PHP пишеться зі знаком долара. За межами класу виклик методів проводиться із зазначенням імені екземпляра класу. Як і для доступу до полів, для виклику методів використовується символ '->'.

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

Створимо екземпляр цього класу і викличемо метод getArea:

$ Rect = new Rectangle (); $ Rect-> width = 15; $ Rect-> height = 20; echo $ rect-> getArea (); // 15 * 20 = 300

Як і функції методи класу можуть брати параметри. Трохи розширимо клас Rectangle. додавши в нього координати верхнього лівого кута і метод translateTo переносить прямокутник в зазначену точку:

Створимо екземпляр класу, дамо його поля значення і викличемо метод translateTo з якими-небудь параметрами:

$ Rect = new Rectangle (); $ Rect-> width = 15; $ Rect-> height = 20; $ Rect-> x = 10; $ Rect-> y = 20; echo "Координати до переміщення:
"." X: $ rect-> x
". // x: 10" y: $ rect-> y
"; // y: 20 $ rect-> translateTo (30, 40); echo" І після:
"." X: $ rect-> x
". // x: 30" y: $ rect-> y "; // y: 40

конструктори

$ Rect = new Rectangle (10, 20, 100, 200); echo "x: $ rect-> x
". // x: 10" y: $ rect-> y
". // y: 20" Ширина: $ rect-> width
". // Ширина: 100" Висота: $ rect-> height
"; // Висота: 200

У старих версіях php ім'я конструктора повинно було збігатися з ім'ям клас, тобто в нашому випадку він виглядав би так:

Це застарілий синтаксис і користуватися ним не варто.

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

Статичні поля і методи, константи

class Klass public static function getCount () > $ Instances = array (); for ($ i = 0; $ i <10; $i++) <$instances[] = new Klass();> echo "Кількість примірників класу:" .Klass :: getCount (). "
"; // 10 $ instance = new Klass (); echo" Кількість після створення ще одного об'єкта: ".Klass :: getCount (); // 11

Зверніть увагу, що спроба змінити поле count ззовні класу викличе помилку, так як це поле записано зі специфікатором доступу private.

// Fatal error: Can not access private property Klass :: $ count in ... Klass :: $ count = -10;

Константа так само доступна ззовні класу:

echo Klass :: CONSTANT_NAME; // 100500

Пару слів про оформлення коду

В php складність ще полягає в тому, що нативні функції, класи, методи і змінні іменовані в різних стилях. Порівняйте: DateTime. in_array. $ _POST. $ GLOBALS. Тому зробити код ідеально однаковим у вас не вийде, але свої власні функції, класи, методи і змінні називайте в одному стилі.

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

І, як завжди, успіхів вам!

Дякую за цікаву статтю.

Будь ласка, Dmitry. Радий, що вам сподобалося.

А що тут використовується для підсвічування коду? Який плагін? Або ж вручну код фарбували?

Спасибо большое, дуже все дохідливо і зрозуміло.
Не можу зрозуміти тільки одне:
-ось є конструктор
public function __construct ($ x, $ y, $ z) $ this-> x = $ x; // тут зрозуміло
...
>
тоесть ті значення, які зумовлені в __construct вже не потрібно
визначати у функціях (методах)
наприклад:
public function coolMix ($ x, $ y) $ this-> x = $ x; // тут вже не потрібно, так?
$ This-> y = $ y // тут вже не потрібно, так?
>

Ні, повторно визначати в методах поля, які були ініційовані в конструкторі, немає необхідності.

Чи зміниться щось якщо я буду створювати екземпляр без дужок, наприклад: $ engine = new Engine; ?







Схожі статті