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 preco deve ser declarada com readonly.
  • O construtor deve inicializar nome e preco.
  • descricao() deve usar number_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

  1. Declaramos a classe Produto com construtor promovido (PHP 8+) para encurtar o código.
  2. public string $nome cria a propriedade e já atribui o valor recebido.
  3. public readonly float $preco faz o mesmo, mas impede reatribuição depois.
  4. O método descricao() usa number_format para exibir o preço com vírgula e duas casas.
  5. No final, criamos um Produto e 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 $preco sem tipo: readonly exige tipo declarado.
  • Tentar reatribuir depois: $p->preco = 5; lança Error: 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