Рубрики
Uncategorized

Все разновидности геттеров PHP 8

Краткое описание множества способов получения ценности от объектов в PHP. С тегами php, программирование, новички, качество кода.

Геттеры – это самые основные методы, которые может иметь класс. Их единственная задача – возвращать значение, обычно из его свойств. Об этом особо нечего сказать.

Или есть? 🤨

Сегодня я собираюсь представить вам 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;
    }
}

✅ Плюсы

  • То же, что и выше
  • Меньше кода для написания, если вам также нужен сеттер

❌ Аферы

Волшебный добытчик

/**
 * @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”