Fácil PHP
Produto com preço readonly
Enunciado
Crie uma classe Produto com as propriedades nome (pública) e preco (readonly). O construtor deve receber os dois valores. Adicione um método descricao() que retorna uma string no formato Nome: R$ preco com duas casas decimais.
Requisitos
- A propriedade
precodeve ser declarada comreadonly. - O construtor deve inicializar
nomeepreco. descricao()deve usarnumber_format($this->preco, 2, ',', '.').- O programa deve criar um produto e imprimir sua descrição.
Código inicial
<?php
declare(strict_types=1);
class Produto
{
// TODO: declarar propriedades e construtor
}
$p = new Produto('Caneta', 3.5);
echo $p->descricao(), PHP_EOL;
Saída esperada
Caneta: R$ 3,50
Ver dica
Use public readonly float $preco; e atribua no construtor. Lembre-se do $this->.
Mostrar solução
<?php
declare(strict_types=1);
class Produto
{
// nome pode mudar; preco é imutável após criação
public function __construct(
public string $nome,
public readonly float $preco,
) {}
public function descricao(): string
{
// Formata com vírgula decimal, padrão brasileiro
return $this->nome . ': R$ ' . number_format($this->preco, 2, ',', '.');
}
}
$p = new Produto('Caneta', 3.5);
echo $p->descricao(), PHP_EOL;
Passo a passo
- Declaramos a classe
Produtocom construtor promovido (PHP 8+) para encurtar o código. public string $nomecria a propriedade e já atribui o valor recebido.public readonly float $precofaz o mesmo, mas impede reatribuição depois.- O método
descricao()usanumber_formatpara exibir o preço com vírgula e duas casas. - No final, criamos um
Produtoe imprimimos sua descrição.
Por que funciona
readonly garante que o preço não mude após o construtor, o que faz sentido para um produto cujo valor não deve ser alterado silenciosamente. A visibilidade public permite ler nome e preco de fora, mas a imutabilidade protege o estado.
Erros comuns
- Esquecer
$this->no método:return $nome . ...gera erro de variável indefinida. - Tentar escrever
public readonly $precosem tipo:readonlyexige tipo declarado. - Tentar reatribuir depois:
$p->preco = 5;lançaError: Cannot modify readonly property.
Outra forma de resolver
Declarar a propriedade fora do construtor e atribuir manualmente:
class Produto {
public readonly float $preco;
public function __construct(public string $nome, float $preco) {
$this->preco = $preco;
}
// ...
}
É preferível quando você precisa validar o valor antes de atribuir.
Saída esperada
Caneta: R$ 3,50