У лучших объяснений есть конкретный пример для иллюстративных целей.Поэтому я попытаюсь привести пример использования virtualProperty
и accessor
, чтобы показать их различия.
У нас есть объект Person
, у него много разных свойств.Одним из них является birthdate
.Давайте рассмотрим пример:
class Person
{
<strong>/**
* @Accessor(getter="getFormattedBirthdate", setter="setBirthdate")
*/</strong>
private $birthdate;
public function setBirthdate(\DateTimeInterface $birthdate): self
{
$this->birthdate = $birthdate;
return $this;
}
public function getBirthdate(): \DateTimeInterface
{
return $this->birthdate;
}
public function getFormattedBirthdate(): string
{
return $this->birthdate->format('j F Y');
}
<strong>/**
* @VirtualProperty()
*/</strong>
public function getAge(): int
{
$today = new \DateTime('today');
$age = $today->diff($this->birthdate);
return $age->y;
}
}
Мы используем Accessor , чтобы указать, какой метод получения и установки будет использоваться при сериализации и десериализации соответственно.По умолчанию getBirthdate
и setBirthdate
были бы использованы.Однако мы хотели бы использовать getFormattedBirthdate
для сериализации.
VirtualProperty помогает нам отображать рассчитанный возраст.Он будет использоваться во время сериализации.Поскольку это не реальное свойство, оно не имеет установщика и не имеет смысла десериализовать его.
Надеюсь, этот пример поможет понять разницу между Accessor и VirtualProperty .