Getter и Setter v1.1.0
Как #[Getter] и #[Setter] из lombok-php работают вместе с AbstractWith.
Введение
AbstractWith наследует \Lombok\Helper. Атрибуты #[Getter] и #[Setter] принадлежат пакету marcin-orlowski/lombok-php, не Dev Tools. Здесь только стыковка: with* — наш WithHandler, get* / set* / is* — Lombok.
Полный контракт атрибутов: документация lombok-php.
Предварительные требования
Пример
use Lombok\Getter;
use Lombok\Setter;
use Devcraft\Abstracts\AbstractWith;
use Devcraft\Attributes\With;
#[Getter]
final class Query extends AbstractWith
{
#[With]
private ?int $page = null;
#[Setter]
private bool $visible = false;
}
$query = (new Query())->withPage(2);
$query->getPage(); // 2
$query->setVisible(true);
$query->isVisible(); // truewithPage() идёт в WithHandler. getPage() / setVisible() / isVisible() — в Lombok.
Класс или свойство
Атрибуты ставят на класс или на свойство.
- На классе: методы для всех подходящих свойств.
publicиstaticмолча пропускаются.#[Setter]также пропускаетreadonly. - На свойстве: только это свойство. Неверные
public/static/readonly(для Setter) бросают исключение.
Если на свойстве уже есть свой #[Getter] или #[Setter], классовый атрибут на это свойство не накладывается. Так сужают набор методов:
use Lombok\Getter;
use Lombok\Setter;
#[Setter, Getter]
final class Entity extends AbstractWith
{
#[Getter]
private int $id = 0;
private ?string $name = null;
}$name получит getName() и setName(). $id — только getId().
#[With] / #[WithItem] не считаются атрибутами Lombok. Классовый #[Getter] спокойно соседствует с #[With] на том же свойстве.
Имена
StudlyCase от свойства: $starting_after → getStartingAfter() / setStartingAfter().
Если единственный тип свойства — bool, геттер называется isVisible(), не getVisible(). В объединении с bool используется обычный get.
set* возвращает $this (можно строить цепочку).
Конструктор
Helper вызывает Lombok::construct($this) в __construct(). Если наследник объявляет свой конструктор:
public function __construct()
{
parent::__construct();
}Без parent::__construct() методы with* работают сразу. Getter/Setter подключатся при первом вызове через lombok-__call (или не подключатся, пока вы не вызовете get* / set*).
Для readonly-класса lombok требует \Lombok\HelperReadonly, не Helper. AbstractWith наследует обычный Helper — такие классы через него не проводят. Readonly свойства классовый Setter пропускает.
Ограничения
- Магические методы не закрывают методы интерфейса.
- IDE не видит
get*/set*без@methodв PHPDoc. - Столкновение с реальным методом: на свойстве — исключение; на классе — остаётся ваш метод, accessor не создаётся.
См. также: AbstractWith, атрибуты With.