Dica de PHP · publicada em
Quando você monta um objeto para transportar dado — um DTO com os campos de um pedido, uma configuração de integração — a intenção é que ele não mude depois de criado. Sem readonly, nada impede.
Marcando as propriedades como readonly, qualquer tentativa de escrita depois da inicialização lança erro. O bug aparece na hora do desenvolvimento em vez de virar comportamento estranho meses depois.
Combinado com a promoção de propriedade no construtor, o resultado é bem enxuto: a classe inteira cabe em quatro linhas e é imutável por construção.
final class ConfigIntegracao {
public function __construct(
public readonly string $endpoint,
public readonly string $token,
public readonly int $timeout = 15,
) {}
}
$c = new ConfigIntegracao('https://api.exemplo.com', 'abc');
// $c->token = 'outro'; // Error: Cannot modify readonly property
Na prática: DTO e config: readonly + promoção no construtor. Quatro linhas e imutável.