Как обходиться со свойствами и значениями по умолчанию внутри класса?

Пишу класс со строго типизированными свойствами, значения которых можно передавать в конструктор:

declare(strict_types=1);

class Position
{
    protected $hours;
    protected $minutes;
    protected $seconds;
    protected $frames;


    public function __construct(int $hours = 0, int $minutes = 0, int $seconds = 0, int $frames = 0)
    {
        $this->setHours($hours);
        $this->setMinutes($minutes);
        $this->setSeconds($seconds);
        $this->setFrames($frames);
    }

    public function getHours(): int
    {
        return $this->hours;
    }


    public function setHours(int $hours): void
    {
        $this->hours = $hours;
    }

    // and so on...
}


1. Правильно ли я делаю, что устанавливаю значения внутри конструктора через сеттеры?
2. Правильно ли будет внутри методов класса получать значения свойств через геттеры?
3. Где прописывать значения по умолчанию для свойств в данном случае - инициализировать ими свойства, или прописывать в значениях по умолчанию для аргументов конструктора (как сделано сейчас), или и там, и там?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MadridianFox
Web-программист, многостаночник
Тут вопрос глубже - а зачем вам геттеры и сеттеры которые ничего не делают?
Вот у вас есть поле. Вы делаете его протектед, и тем самым говорите внешнему миру - это моё поле, вам о нём знать не надо, оно нужно мне для моей внутренней работы. Ок.
Если вам надо дать возможность снаружи писать и читать это поле, то... вам не надо делать его протектед.

Вот, если бы вы делали какие-то преобразования, то тут ещё может быть... Вот представьте, что у вас в объекте есть поле, которое хранит дату. Вы делаете методы setDate(string $date) и getDate(): string, но в поле записываете не строку, а объект DateTime. Вот тогда всё логично, и вопроса - пользоваться ли геттером и сеттером внутри класса не возникает. Хотите работать напрямую с DateTime - работаете с полем. Хотите со строкой - работаете с геттером и сеттером.

Другой пример - вы делаете только геттер или только сеттер. С помощью только геттера вы делаете ваше поле read only. оно доступно снаружи, но снаружи его никто не изменит. Внутри класса использовать такой геттер не имеет смысла.
Ответ написан
@McBernar
1. Зачем? Сеттеры нужны для обращения извне класса. В этом вся суть инкапсуляции.
2. То же самое.
3. Если в конструктор может не прилететь какой-то параметр — очевидно, что там должны быть значения по-умолчанию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы