Closures e 'use'
Parte da seção Lógica & Fluxo do Journey de PHP da Coddy — lição 2 de 68.
Por padrão, funções anônimas só podem acessar variáveis que são passadas a elas como parâmetros. Mas e se você precisar que sua closure acesse uma variável do escopo circundante? É aqui que a palavra-chave use entra em cena.
A palavra-chave use permite que uma closure "capture" variáveis de seu escopo pai e as utilize dentro da função:
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // Saída: Welcome, Bob!
?>Observe como $message é definida fora da função, mas ao incluir use ($message) após a lista de parâmetros, a closure pode acessar e usar essa variável. Você pode capturar múltiplas variáveis separando-as com vírgulas: use ($var1, $var2).
Este recurso torna as closures muito mais poderosas, permitindo que elas trabalhem com dados de seu contexto circundante, enquanto ainda mantêm a flexibilidade de funções anônimas.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilCrie uma função anônima que capture uma porcentagem de desconto do escopo circundante usando a palavra-chave use. A função deve receber um preço como parâmetro e retornar o preço final após a aplicação do desconto.
Você receberá duas entradas: a porcentagem de desconto e o preço original. Leia ambas as entradas, crie uma closure que capture a porcentagem de desconto, chame a closure com o preço e imprima o preço final após o desconto.
Formato de entrada: Duas linhas - a primeira linha contém a porcentagem de desconto (um número), a segunda linha contém o preço original (um número que pode conter decimais)
Saída esperada: O preço final após a aplicação do desconto
Folha de consulta
A palavra-chave use permite que closures capturem variáveis de seu escopo pai:
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // Saída: Welcome, Bob!
?>Você pode capturar múltiplas variáveis separando-as com vírgulas: use ($var1, $var2).
Experimente você mesmo
<?php
// Ler entradas
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: Criar uma função anônima que captura a porcentagem de desconto usando 'use'
// A função deve receber um parâmetro de preço e retornar o preço final após o desconto
// TODO: Chamar a closure com o preço e armazenar o resultado
// Exibir o preço final
echo $finalPrice;
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Funções Avançadas
Funções AnônimasClosures e 'use'Arrow FunctionsFunções de CallbackUsando 'call_user_func'Funções VariáveisPassagem por ReferênciaFunções RecursivasRecapitulação: Mix de Funções4Arrays Multidimensionais
Criando um Array 2DAcessando Elementos de um Array 2DModificando Elementos de um Array 2DIterando com Loops AninhadosArrays Associativos 2DRecapitulação: Exercício de Grade Simples2Manipulações Avançadas de Arrays
Adicionando com 'array_push'Removendo com 'array_pop'Adicionando com 'array_unshift'Removendo com 'array_shift'Mesclando Arrays IndexadosMesclando Arrays AssociativosExtraindo com 'array_slice'Valores com 'in_array'Chaves com 'array_search'Recapitulação: Exercício de Playlist3Ordenação de Arrays
Ordenar Arrays Indexados (Crescente)Ordenar Arrays Indexados (Decrescente)Ordenar Arrays Associativos por ValorOrdenar Arrays Associativos por ChaveOrdenação por Ordem NaturalOrdenação Personalizada com 'usort'Recapitulação: Ordenação de Leaderboard