abstract class Entity
{
public function __get($property)
{
if (!property_exists($this, $property)) {
throw new \Exception('');
}
return $this->$property;
}
}
/**
* Class User
* @property Email $email
*/
class User extends Entity
{
protected $email;
public function __construct(Email $email)
{
$this->email = $email;
}
}
/**
* Class AuthorizedUser
* @property User $user
* @property DateTime $lastAuthDate
*
*/
class AuthorizedUser extends Entity
{
protected $user;
protected $lastAuthDate;
public function __construct(User $user, DateTime $lastAuthDate)
{
$this->user = $user;
$this->lastAuthDate = $lastAuthDate;
}
}
// пример 2
$class = new SomeClass();
$result = $class->doSomething($id);
$object = new SomeClass($id);
$object->doSomething($id);
>1. Поэтому разработка ухудшается когда IDE вам подсказывает о наличие свойства а по факту его нет.
Т.е. код переписать не забыли, а изменить свойство - забыли. Не лучше просто свойство дописать/переписать вместо кода доступа к свойству. Код УЖЕ написан для всех свойств.
>2. Гетеры предоставляют скрытие реализации, ...
а без геттеров нет сокрытия реализации?
>Внешний код как был настроен на getEmail() так и остался.
А $user->email нужно будет изменять?
>я представляю код завязанный на $user->email не получится просто взять и отрефакторить
Это почему же?
>3. через сеттеры, можно делать валидацию, как писали выше, это удобно ... в вашем случае модель может ходить с некорректными данным по приложению
Валидацию нужно делать не через setter-ы, а там, где создается объект. Например для email - при создании email. Потому что это ЕСТЬ email.
Например:
Не оно? Плохо? Трудно валидировать?