Геттеры – это самые основные методы, которые может иметь класс. Их единственная задача – возвращать значение, обычно из его свойств. Об этом особо нечего сказать.
Или есть? 🤨
Сегодня я собираюсь представить вам 10 способов вы можете реализовать геттер в PHP 8.0.
- Публичный доступ
- Классический геттер
- Классический добытчик, но без глагола
- Геттер/сеттер
- Волшебный добытчик
- Устройство для получения смещения
- Волшебный зов
- Средство получения ссылок
- Нарушение инкапсуляции 🤫
- Возврат закрытия
Давайте приступим к работе!
Публичный доступ
class User
{
public string $name = "Robert PAULSON";
}
✅ Плюсы
- Нет необходимости писать метод получения
❌ Аферы
- Не может быть частью интерфейса
- Раскрывает внутреннее состояние объекта
Классический геттер
class User
{
public function getName(): string
{
return "Robert PAULSON";
}
}
✅ Плюсы
- Может быть частью интерфейса
- Простой и понятный
❌ Аферы
- \_(ツ)_/
Классический добытчик, но без глагола
class User
{
public function name(): string
{
return "Robert PAULSON";
}
}
✅ Плюсы
- Все еще может быть частью интерфейса
- Короче, чем getName
❌ Аферы
- Методы без глагола могут сбивать с толку
Геттер/сеттер
class User
{
private string $name = "Robert PAULSON";
public function name(?string $name = null): string
{
if ($name) {
$this->name = $name;
}
return $this->name;
}
}
✅ Плюсы
- То же, что и выше
- Меньше кода для написания, если вам также нужен сеттер
❌ Аферы
- Что делать, если вы хотите установить значение
null? - Нарушает Принцип единой ответственности
Волшебный добытчик
/**
* @property string $name
*/
class User
{
private string $name = "Robert PAULSON";
public function __get($key)
{
if ($key == 'name') {
return $this->name;
}
}
}
✅ Плюсы
- Вы можете предоставлять доступ защищенным и закрытым пользователям на своих собственных условиях
❌ Аферы
- Вы не всегда можете ввести намек на возвращаемое значение
- Некоторые компании запретили это (серьезно)
- Вам понадобится аннотация
@propertyили PhpStorm не будет “видеть” это
Устройство для получения смещения
class User extends ArrayAccess
{
public offsetExists($offset): bool
{
return $offset == 'name';
}
public offsetGet($offset)
{
if ($offset == 'name') {
return 'Robert PAULSON';
}
}
}
✅ Плюсы
- То же, что и волшебный добытчик
- Супер круто
$объект['имя']обозначение
❌ Аферы
- То же, что и волшебный добытчик
Волшебный зов
/**
* @method string getName()
*/
class User
{
public function __call($method, $args)
{
if ($method == 'getName') {
return 'Robert PAULSON';
}
}
}
✅ Плюсы
- То же самое, что использовать магические добытчики
- Экономьте “пространство” , группируя несколько геттеров в одном методе
- Вы можете создавать псевдонимы для существующих желобов без добавления новых методов
❌ Аферы
- Вам понадобится аннотация
@способили PhpStorm не будет “видеть” оно - Если вам это нужно, чтобы уменьшить количество методов в вашем классе, это может быть признаком проблемы с дизайном
Средство получения ссылок
class User
{
private string $name = "Robert PAULSON";
public function &getName(): string
{
return $this->name;
}
}
// usage
$user = new User;
var_dump($user); // string(14) "Robert PAULSON"
$name = &$user->getName();
$name = "Tyler DURDEN";
var_dump($user); // string(12) "Tyler DURDEN"
✅ Плюсы
- Используется для оптимизации производительности (устраняет накладные расходы на вызов функции)
❌ Аферы
- Надеюсь, ты знаешь, что делаешь
Нарушение инкапсуляции
class User
{
private string $name = "Robert PAULSON";
}
// can't access $name because it's private
// and there's no getter to obtain its value
$user = new User();
// let's use the reflection API
$property = (new ReflectionClass(User::class))->getProperty('name');
$property->setAccessible(true);
$name = $property->getValue($user);
echo $name; // Robert PAULSON
✅ Плюсы
- Очень полезно для отладки классов, которыми вы не владеете, без их переписывания
❌ Аферы
- Очень медленный
- Довольно уродливый
Возврат закрытия
class User
{
private $name = "Robert PAULSON";
public function obtainNameGetter(): callable
{
return fn() => $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
// usage
$user = new User();
$getter = $user->obtainNameGetter();
echo $getter(); // "Robert PAULSON"
// now let's change the username
$user->setName("Tyler DURDEN");
echo $getter(); // "Tyler DURDEN"
✅ Плюсы
- Может использоваться для решения циклических зависимостей
- Реализация ленивой загрузки для бедных людей
- Вы можете составить возвращенное закрытие
❌ Аферы
- Возвращенное закрытие представляет собой черный ящик
- Вы не можете легко сериализовать возвращаемое значение
Я что-то пропустил? Скажите мне, что вы думаете об этом списке в комментариях, и не забудьте поставить лайк/подписаться, это мотивирует меня писать больше статей для вас 🤗
Оригинал: “https://dev.to/bdelespierre/all-flavors-of-php-8-getters-51no”