Fácil PHP

Função de saudação com parâmetro padrão

Enunciado

Crie uma função saudacao que recebe um nome e um período do dia (com valor padrão "dia"). A função deve retornar uma string no formato "Bom dia, [nome]!" ou "Boa tarde, [nome]!" ou "Boa noite, [nome]!" conforme o período. Use match para escolher a saudação.

Requisitos

  • A função deve se chamar saudacao e ter dois parâmetros: $nome (string) e $periodo (string, padrão 'dia').
  • Deve retornar a string formatada corretamente para os períodos 'dia', 'tarde' e 'noite'.
  • Se o período não for reconhecido, deve lançar uma exceção InvalidArgumentException.

Código inicial

<?php
// Complete a função saudacao
function saudacao(string $nome, string $periodo = 'dia'): string {
    // seu código aqui
}

// Testes
echo saudacao('Ana') . PHP_EOL;
echo saudacao('Carlos', 'tarde') . PHP_EOL;
echo saudacao('Bia', 'noite') . PHP_EOL;

Saída esperada

Bom dia, Ana!
Boa tarde, Carlos!
Boa noite, Bia!
Ver dica

Use match para mapear o período para a saudação. Lembre-se de tratar o caso padrão com default e lançar a exceção.

Mostrar solução
<?php
declare(strict_types=1);

function saudacao(string $nome, string $periodo = 'dia'): string {
    $saudacao = match ($periodo) {
        'dia'   => 'Bom dia',
        'tarde' => 'Boa tarde',
        'noite' => 'Boa noite',
        default => throw new InvalidArgumentException("Período inválido: $periodo"),
    };
    return "$saudacao, $nome!";
}

echo saudacao('Ana') . PHP_EOL;
echo saudacao('Carlos', 'tarde') . PHP_EOL;
echo saudacao('Bia', 'noite') . PHP_EOL;

Passo a passo

  1. Declaramos a função saudacao com dois parâmetros: $nome (obrigatório) e $periodo (opcional, padrão 'dia').
  2. Usamos match para comparar $periodo e retornar a saudação correspondente.
  3. No caso default, lançamos uma exceção InvalidArgumentException para períodos não reconhecidos.
  4. A variável $saudacao recebe a string da saudação (ex.: 'Bom dia').
  5. Retornamos a concatenação de $saudacao, vírgula, espaço, $nome e exclamação.
  6. Chamamos a função três vezes: sem o segundo argumento (usa padrão), com 'tarde' e com 'noite'.
  7. Exibimos os resultados com echo e quebra de linha PHP_EOL.

Por que funciona

A função encapsula a lógica de saudação, usando o valor padrão para simplificar chamadas comuns. O match é uma expressão que retorna um valor e permite lançar exceções no default, garantindo que apenas períodos válidos sejam aceitos. O tipo de retorno string assegura que a função sempre devolve texto.

Erros comuns

  • Esquecer o default no match: isso gera um UnhandledMatchError se o período for inválido. Solução: incluir default => throw new InvalidArgumentException(...).
  • Não declarar o tipo de retorno : string: o código funciona, mas perde a verificação de tipos. Solução: adicionar : string após os parênteses.
  • Usar if em vez de match e esquecer de retornar em algum caso: a função pode retornar null implicitamente. Solução: usar match ou garantir return em todos os caminhos.

Outra forma de resolver

Usar switch:

switch ($periodo) {
    case 'dia': $saudacao = 'Bom dia'; break;
    case 'tarde': $saudacao = 'Boa tarde'; break;
    case 'noite': $saudacao = 'Boa noite'; break;
    default: throw new InvalidArgumentException("Período inválido: $periodo");
}
return "$saudacao, $nome!";

Prefira match por ser mais conciso e seguro.

Saída esperada

Bom dia, Ana!
Boa tarde, Carlos!
Boa noite, Bia!