Taverna /dev/All

PHP - Função Callback

Qual o conceito informal de callback e em quais meios práticos devo utilizá-lo?
Neste link encontrei um conceito um pouco mais informal só que não consegui abstrair totalmente.
Pelo que entendi ele serve para (call) chamar (back) depois/após alguma coisa… é isso mesmo produção?

1 Curtida

O callback pode ser visto como uma estratégia para a execução assíncrona de código: costumam chama-la de “não me procure, eu te procuro”.

A ideia é justamente esta: você passa para uma função que irá executar determinada operação uma outra função como parâmetro.

Esta outra função enviada como parâmetro funciona normalmente como uma espécie de ouvinte: o código que a recebeu irá executá-la assim que o processamento for concluído ou mesmo no meio do seu processamento para que alguma ação seja tomada durante sua execução.

Um exemplo interessante de callbacks poderia ser a apresentação do status de um processmaento. Vou colocar aqui uma situação usando JavaScript, mas o conceito é o mesmo para o PHP.

Imagine que temos uma função chamada gerarRelatorio, que tem uma assinatura parecida com a que vou expor a seguir:

function gerarRelatorio(dataInicial, datraFinal, callback) {

}

Este callback, naturalmente, vamos chegar a um acordo a respeito dos parâmetros que irá receber durante a execução. Dado que meu objetivo aqui é mostrar a porcentagem do relatório que está pronta, imagino que sua assinatura seja algo como isto:

function statusRelatorio(percentualPronto)

Então, na implementação da minha função gerarRelatorio, eu poderia fazer algo assim:

function gerarRelatorio(dataInicial, dataFinal, callback) {
   // obtenho os dados do meu relatorio para o processamento, me retorna um array
    var dados = obterDados(dataInicial, dataFinal)
    for (var i = 0; i < dados.length; i++) {
            // executo meu trabalho de processamento e,
            // de tempos em tempos (quando i for divisível por 10) aviso o callback do status do
           // processamento passando a porcentagem
           if (i % 10 == 0) {
                   callback(i / dados.length * 100); // executo o callback passando a porcentagem pronta
           }
    }


}

Este é um dos exemplos, mas a ideia é justamente esta: você ter o processamento executado assíncronamente. Você passa a função como parâmetro e espera que ela seja chamada no futuro. Pra quê, depende muito do que a função que a chama está fazendo.

1 Curtida

Obrigado, foi muito esclarecedor.

itexto