Роман
может переписать на 8.4) проект
или 8.4 ещё тестируется
Роман
я так и не понял принятая ли это практика до 8.4 избавляться от get/set или лучше по старинке
The Ant
Блин... Или тут свойство буквально геттер ) пздц конечно определение
Kirill
короче, минусы полей:
1) Нет возможности описать интерфейсом, только через @property-read/@property-write аннотацию
2) Нет контроля доступа на чтение и запись, только через __get/__set, что ведёт к оверинжинерингу и getSome/setSome в данном случае лучше, нежели костыли через магию
3) Нет модификаторов доступа на "только чтение", решено в php 8, ранее через @readonly или @preoprty-read
4) Нет контроля типов решено в php 7
Kirill
это те причины зачем можно было писать геттеры и сеттеры
Роман
зачем нужен контроль доступа, что это значит, зачем интерфейсы
Kirill
вот и получается, что в современном мире php 8 они нужны только для п.1 и п.2, только в случае энтитей (и то спорно)
Роман
и зачем, полиморизм для сущностей, DI
Kirill
ну мало ли зачем, эвент сорсинг например
Kirill
или логгирование
Kirill
или ещё что
Kirill
кеширование
Kirill
мемоизация
Роман
ладно значит можно убрать этот оверхэд переписать на публичные свойства
Роман
а если понадобится к чему то можно и приделать get/set
Kirill
get/set методы эти как раз и нужны чтоб потом не приделывать ничего)
Kirill
надо просто не бездумно копипастить и повторять старые мантры, а голову подключать. Там где нужно использовать, а где нет - не использовать.
В энтитях, если ты не собираешься вообще переезжать на 8.4, то лучше оставить как есть
Kirill
А в остальных местах, да, оно нахрен не надо
Роман
в остальных некогда и не использовал
Kirill
меня больше радует что чуваки пишут DTO так, а потом страдают)
Kirill
вместо того, чтоб просто написать что-то вроде:
readonly class GameResponseDTO
{
/**
* @param non-empty-string $id
* @param non-empty-string $title
* @param list<ProfileInfoDTO> $profiles
*/
public function __construct(
public string $id,
public string $title,
public GameResponseType $type,
public BanInfoResponseDTO $ban = new BanInfoResponseDTO(),
public array $profiles = [],
) {}
}
Роман
ага)
Роман
ещё toArray
Роман
а то как данные брать
Kirill
ну toArray не обязательно, есть же гидраторы/сериалайзеры
Юра
Блин не люблю свойства. Люди начинают туда пихать логику какую-то помимо валидации и потом ты смотришь на код в котором вроде просто присваивание значения какому-то проперти а там под капотом непонятно что. Затрудняет понимание кода без какого-то профита
Роман
что это
Kirill
что это
ну правила преобразований
Kirill
в ямлике описываешь и всё, типа такого:
App\Presentation\Response\DTO\Game\EFTGameResponseDTO:
read_only: false
properties:
id: { type: string }
title: { type: string }
edition: { type: App\Presentation\Response\DTO\Game\EFT\EditionResponseDTO }
profiles: { type: array<App\Presentation\Response\DTO\Profile\ProfileInfoDTO> }
ну или атрибутами
Kirill
Роман
это что такое и как вызвать
Kirill
а так то в симфе из коробки оно своё
Роман
короче тоже оферхэд
Kirill
ну хз, по-мне написать один раз $serializer->toArray($dto) проще, чем у КАЖДОЙ дто описывать правила преобразования в ассоциативный массив
Роман
toArray норм, если наверно нет нескольких способов сериализации
Роман
а что в этом $serializer->toArray() магические методы?
Kirill
ну посмотри доки по симфони сериалайзеру
Роман
для преобразования всех свойств в массив
Kirill
https://symfony.com/doc/current/components/serializer.html
Kirill
только там не toArray, а normalize называется метод преобразования в примитивный объект (который потом хоть в json, хоть куда угодно отправляй)
Роман
namespace App\Model;
class Person
{
private int $age;
private string $name;
private bool $sportsperson;
private ?\DateTimeInterface $createdAt;
// Getters
public function getAge(): int
{
return $this->age;
}
public function getName(): string
{
return $this->name;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
// Issers
public function isSportsperson(): bool
{
return $this->sportsperson;
}
// Setters
public function setAge(int $age): void
{
$this->age = $age;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function setSportsperson(bool $sportsperson): void
{
$this->sportsperson = $sportsperson;
}
public function setCreatedAt(?\DateTimeInterface $createdAt = null): void
{
$this->createdAt = $createdAt;
}
}
даже здесь подход с set/get
Kirill
Роман
в доках говнокод не напишут)
Kirill
видно же что он для примера только
Kirill
чтоб понятнее было
Kirill
а так-то за такое надо наказывать
Роман
ну найди статью где пишут по другому и объясняют почему
может ты один такой)
Kirill
да и пусть генерится себе)
Kirill
просто это глючный и кривой код
Kirill
плюс код лишний, который можно сократить в 10 раз
The Ant
Всю жизнь так делали, а сейчас глючный стал? Ну такое
Kirill
и при этом ничего не потерять вообще
Kirill
The Ant
Kirill
раньше?
The Ant
Угу
Kirill
выделяли предметную область энтитей
Kirill
и описывали их поведение
The Ant
Сложно...
Роман
```php
namespace App\Model;
class Person
{
public int $age;
public string $name;
public bool $sportsperson;
public ?\DateTimeInterface $createdAt;
}
```
так наверно X)
Kirill
Роман
так ты сам такое рекомендовал
The Ant
это ещё хуже
Жесть. Ну давай как надо. Ток без новых гет/сет всратых конструкций из пхп 8.4
Kirill
капитан очевидность и мануал по основам ООП говорит явным языком, что во время создания объекта он должен иметь минимально допустимую информацию чтобы работал
Kirill
методы инициализации объектов фактически являются практикой плохого проектирования объекта
Kirill
вроде даже антипаттерн
The Ant
Роман
```php
namespace App\Model;
class Person extand AbstractPerson
{
private int $age;
private string $name;
private bool $sportsperson;
private ?\DateTimeInterface $createdAt;
}
class AbstractPerson
{
// Getters
public function getAge(): int
{
return $this->age;
}
public function getName(): string
{
return $this->name;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
// Issers
public function isSportsperson(): bool
{
return $this->sportsperson;
}
// Setters
public function setAge(int $age): void
{
$this->age = $age;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function setSportsperson(bool $sportsperson): void
{
$this->sportsperson = $sportsperson;
}
public function setCreatedAt(?\DateTimeInterface $createdAt = null): void
{
$this->createdAt = $createdAt;
}
}
```
так что ли)
Kirill
это рофл?
Kirill
боже, голову включите)
The Ant
Kirill
вместо рофлов
Kirill
Kirill
у тебя new Person() создаст ПОЛОМАННЫЙ объект, который не будет работать
Kirill
что будет если ты напишешь
$p = new Person();
echo $p->getName();
?
Роман
а конструктор добавит со всеми полями
Kirill
как минимум