Як звернутися до якості класу PHP?
Стаття присвячена зверненням до властивостей класу в PHP, їх визначення та ініціалізації, а також методів запису та успадкування властивостей. Покрокові приклади допоможуть краще зрозуміти тему.
Зміст
Властивості класу в PHP іноді називають атрибутами або полями класу, але найбільш поширеним терміном все ж таки залишаються "властивості". При оголошенні властивостей за умовчанням їх значення встановлюється null . Важливо, що ініціалізація якості значенням може відбуватися під час завантаження класу на згадку, але ці накладає обмежень зміну цих властивостей у майбутньому.
Джерело зображення: dzen.ru
Визначення властивостей
У PHP властивості класів можна визначати за допомогою ключового слова var , проте це не рекомендується, тому що за своєю дією var еквівалентно public і існує тільки для зворотної сумісності з версіями PHP старше 5.
Кожен об'єкт класу отримує власну копію властивостей. Це означає, що властивості не належать до класу, а належать об'єктам, створеним на основі цього класу. Подібна поведінка аналогічна структурам даних.
Джерело зображення: archive-ipq-co.narod.ru
Звернення до властивостей
Динамічне звернення до властивостей
У деяких випадках ім'я властивості, до якої необхідно звернутися, може зберігатись у змінній. І тому використовується спеціальний синтаксис звернення до властивості.
Використання $this
Щоб звернутися до властивості класу всередині його методів, потрібно використовувати спеціальну змінну $this замість імені об'єкта:
class User < public $name; public $age; public function show() < return $this->name; // Повернімо ім'я з якості >>
Спробуємо створити об'єкт класу та перевірити роботу методу show() :
$user = new User; // створюємо об'єкт класу $user->name = 'john'; // записуємо ім'я $user->age = 25; // записуємо вік // Викликаємо метод: echo $user->show(); // виведе 'john'
Див. також
Запис властивостей
За допомогою $this можна також записувати значення властивостей. Розглянемо метод setName() , який приймає ім'я користувача як параметр і записує його як name :
class User < public $name; public $age; // Метод зміни імені користувача: public function setName($name) < $this->name = $name; // Запишемо нове значення властивості name>> $user=new User; // створюємо об'єкт класу $user->name = 'john'; // записуємо ім'я $user->age = 25; // записуємо вік // Встановимо нове ім'я $user->setName('eric'); // Перевіримо, що ім'я змінилося: echo $user->name; // виведе 'eric'
Структура класів
Кожне визначення класу починається з ключового слова class після чого вказується ім'я класу і відкриваються фігурні дужки для визначення властивостей і методів. Ім'я класу має відповідати певним правилам:
- Не повинно містити зарезервованих слів PHP.
- Повинна починатися з літери або символу підкреслення.
- Може містити будь-які літери, цифри та символи підкреслення.
Якщо задати ці правила у вигляді регулярного виразу, то вийде: ^[a-zA-Z_x80-xff][a-zA-Z0-9_x80-xff]*$ .
Класи можуть включати константи, властивості (змінні) та методи (функції).
Джерело зображення: ppt-online.org
Класи лише для читання
Починаючи з версії PHP 8.2.0, можна помітити клас модифікатором readonly. Це додає модифікатор до всіх оголошених властивостей та забороняє створення динамічних властивостей. Спроба додати динамічні властивості до readonly-класу призведе до помилки компіляції.
// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
| Помилка |
Опис |
| Fatal error: Readonly property Foo::$bar повинен мати тип |
Разом з реальноне можна оголошувати нетипізовані та статичні властивості. |
| Fatal error: Readonly class Foo cannot declare static properties |
Readonly-клас не може оголошувати статичні властивості. |
Readonly-класи можна розширювати, якщо дочірній клас також відзначений модифікатором readonly.
Див. також
Успадкування властивостей
Для використання механізму спадкування в PHP необхідно вказати в оголошенні класу після імені класу спадкоємця слово extends та ім'я класу-предка. Якщо в класі-спадкоємці перевизначаються методи предка, доступ до методів предка можна отримати за допомогою ключового слова parent.
Для запобігання перевизначенню методів можна використовувати модифікатор final.
При наслідуванні для звернення до конструктора батьківського класу в конструкторі дочірнього класу необхідно викликати parent::__construct(); .
Внутрішні методи можуть бути реалізовані без інтерфейсу, але для оголошення додаткових властивостей використовується interface-extension у файлі реалізації.
Приклад успадкування від одного класу та двох інтерфейсів:
Джерело зображення: php.zone
Що нам скаже Вікіпедія?
Для використання механізму спадкування в PHP необхідно в оголошенні класу після імені класу-спадкоємця, що оголошується, вказати слово extends та ім'я класу-предка:
У разі перекриття класом-спадкоємцем методів предка, доступ до методів предка можна отримати з використанням ключового слова parent:
Можна запобігти перекриття класом-спадкоємцем методів предка; для цього необхідно вказати ключове слово final:
Щоб при наслідуванні звернутися до конструктора батьківського класу, необхідно дочірньому класу в конструкторі вказати parent::__construct();
Внутрішні методи можна реалізувати без інтерфейсу. Для оголошення додаткових властивостей користуються interface-extension у файлі реалізації.
Приклад успадкування від одного класу та двох інтерфейсів:
Зміст
Як звернутися до методу класу PHP?
У мене великий об'єкт $obj , звертаюся до потрібних елементів $obj->dish->content без проблем, але потім упираюся ось у що: Функція print_r($obj->dish->content) мені виводить ось таку конструкцію:
( [1300] => stdClass Object ( [foo] => 1 порц [kbju] => 440 / 29 / 16 / 45 ) [1400] => stdClass Object ( [bar] => 1 порц [kbju] => 440 / 29 / 16 / 45 ) )
як мені звертатися до об'єктів усередині?
неа, помилка PHP Fatal error: Uncaught Error: Cannot use object of type stdClass as array