__get, __set, __isset, __unset
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 46 из 91.
PHP предоставляет четыре magic methods, которые перехватывают доступ к свойствам: __get(), __set(), __isset() и __unset(). Они срабатывают, когда вы пытаетесь получить доступ к свойствам, которые не exist или недоступны.
Метод __get() вызывается при чтении недоступного свойства, а __set() обрабатывает запись в него. Это позволяет создавать динамические свойства или добавлять логику при обращении к свойствам:
<?php
class DynamicObject {
private array $data = [];
public function __get(string $name): mixed {
return $this->data[$name] ?? null;
}
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
}
$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;
Вывод:
Hello - 42Метод __isset() вызывается с помощью isset() или empty(), а __unset() отвечает на вызов функции unset():
<?php
class DynamicObject {
private array $data = [];
public function __set(string $name, mixed $value): void {
$this->data[$name] = $value;
}
public function __isset(string $name): bool {
return isset($this->data[$name]);
}
public function __unset(string $name): void {
unset($this->data[$name]);
}
}
$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";
Вывод:
existsЭти методы обычно используются для создания гибких контейнеров data, implement ленивой загрузки или построения объектов, которые ведут себя как массивы, сохраняя объектно-ориентированную структуру.
Задание
ЛегкоДавайте создадим гибкий менеджер конфигурации, который динамически хранит настройки с помощью magic methods. Ваш class будет перехватывать доступ к свойствам для управления значениями configuration, проверять, существуют ли настройки, и при необходимости удалять их — всё это без явного определения каждого свойства.
Вы организуете свой код в двух файлах:
Config.php: Create classConfig, который использует private array для внутреннего хранения значений configuration. Implement все четыре magic methods свойств:__get($name): Возвращает значение для указанного key или"undefined", если key не существует__set($name, $value): Сохраняет значение по указанному key__isset($name): Возвращает информацию о том, существует ли key в configuration__unset($name): Удаляет key из configuration
count(), который возвращает number сохранённых настроек.main.php: Подключите файл Config. Вы получите три inputs: имя настройки, значение настройки и имя второй настройки. Create экземплярConfigи выполните следующие операции:- Установите первую настройку в given значение
- Print, существует ли первая настройка, используя
isset(): выведите"exists"или"missing" - Print значение первой настройки
- Print current количество настроек
- Используйте
unset(), чтобы remove первую настройку - Print, существует ли теперь первая настройка: выведите
"exists"или"missing" - Print значение второй настройки (которая never устанавливалась)
Каждый результат должен находиться на отдельной строке. Magic methods позволяют взаимодействовать с вашим объектом Config, используя естественный синтаксис свойств, например $config->theme = "dark" и isset($config->theme), даже несмотря на то, что фактические свойства не определены.
Попробуйте сами
<?php
require_once 'Config.php';
// Читать входные данные
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Создать экземпляр Config
// TODO: Установить первую настройку в заданное значение
// TODO: Вывести, существует ли первая настройка ("exists" или "missing")
// TODO: Вывести значение первой настройки
// TODO: Вывести текущее количество настроек
// TODO: Использовать unset() для удаления первой настройки
// TODO: Вывести, существует ли первая настройка сейчас ("exists" или "missing")
// TODO: Вывести значение второй настройки (которая никогда не была установлена)
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP