Show the modern approach: "A readonly class with promoted constructor parameters gives me an immutable DTO in three lines. For value objects, I add validation in the constructor and an equals() method. PHP 8.2 made this pattern practically free."
Value objects represent concepts defined by their values rather than identity — two Money objects with the same amount and currency are equal regardless of identity. DTOs (Data Transfer Objects) carry data between layers without behaviour. PHP 8.2 readonly classes make both trivial to implement: all properties are readonly by default, immutability is enforced by the language, and constructor promotion eliminates boilerplate. Strong candidates discuss: the difference between value objects (have equality logic and business rules) and DTOs (pure data carriers), when to use readonly properties versus readonly classes, implementing equals() methods, and using value objects to replace primitive obsession (passing $email as string vs Email value object with validation).
Tests modern PHP design. Candidates who pass arrays of data between layers lose type safety and validation. Those who use value objects and DTOs with readonly classes write self-documenting, safe code with minimal boilerplate.