Fácil PHP

Saudação com closure e use

Enunciado

Crie uma closure que recebe um nome e imprime uma saudação usando uma variável externa $saudacao. A closure deve capturar $saudacao com use.

Requisitos

  • A closure deve usar use ($saudacao).
  • A saída deve ser exatamente Bom dia, Ana! seguida de nova linha.
  • O código deve ser executável sem erros.

Código inicial

<?php

$saudacao = "Bom dia";
// Crie a closure e chame-a com "Ana"

Saída esperada

Bom dia, Ana!
Ver dica

A sintaxe é function($nome) use ($saudacao) { ... }.

Mostrar solução
<?php

$saudacao = "Bom dia";
$cumprimentar = function($nome) use ($saudacao) {
    echo "$saudacao, $nome!\n";
};

$cumprimentar("Ana");

Passo a passo

  1. Definimos a variável $saudacao com o valor "Bom dia".
  2. Criamos uma closure atribuída a $cumprimentar.
  3. A cláusula use ($saudacao) importa a variável externa para dentro da closure.
  4. Dentro da closure, usamos $saudacao e $nome para montar a mensagem.
  5. Chamamos a closure passando "Ana", que imprime Bom dia, Ana!.

Por que funciona

Closures em PHP não capturam automaticamente variáveis do escopo externo; é preciso declarar use. Isso deixa explícito quais valores a função está usando, evitando efeitos colaterais indesejados. A variável capturada é uma cópia do valor no momento da definição.

Erros comuns

  • Esquecer o use: function($nome) { echo "$saudacao"; } gera aviso de variável indefinida e imprime vazio.
  • Usar use com variável inexistente: use ($outra) causa erro de variável não definida.
  • Tentar modificar $saudacao dentro da closure sem &: a alteração não reflete fora, pois a captura é por valor.

Outra forma de resolver

Com arrow function, que captura automaticamente:

$cumprimentar = fn($nome) => print("$saudacao, $nome!\n");
$cumprimentar("Ana");

Arrow functions são mais concisas, mas não permitem múltiplas linhas ou captura por referência.

Saída esperada

Bom dia, Ana!