Callbacks / Callables

Callbacks podem ser representadas pela declaração de tipo callable.

Algumas funções como call_user_func() ou usort() aceitam funções de callback definidas pelo usuário como parâmetro. Funções de callback não precisam ser apenas funções simples, mas também métodos de objects, incluindo os estáticos.

Passagem por parâmetro

Uma função PHP é passada através do seu nome como uma string. Qualquer função interna ou definida pelo usuário pode ser utilizada, com exceção dos construtores de linguagem como: array(), echo, empty(), eval(), exit(), isset(), list(), print ou unset().

Um método de um object instanciado é passado como um array contendo um object no índice 0 e o nome do método no índice 1. Acessar métodos protegidos e privados de uma classe é permitido.

Métodos estáticos também podem ser passados sem a instância de um object dessa classe ao passar um nome da classe em vez de um object no índice 0, ou passando 'ClassName::methodName'.

Além de funções comuns definidas pelo usuário, funções anônimas e arrow functions também podem ser passadas como um parâmetro de callback.

Note:

A partir do PHP 8.1.0, funções anônimas também podem ser criadas usando a sintaxe de callable de primeira classe.

Geralmente, qualquer objeto implementando __invoke() também pode ser passado para um parâmetro callback.

Example #1 Exemplos de funções de callback

<?php

// Exemplo de função de callback
function minha_funcao_callback() {
    echo 'olá mundo!';
}

// Exemplo de método de callback
class MinhaClasse {
    static function meuMetodoCallback() {
        echo 'Olá Mundo!';
    }
}

// Tipo 1: Calback simples
call_user_func('minha_funcao_callback');

// Tipo 2: Chamada a métodos estáticos
call_user_func(array('MinhaClasse', 'meuMetodoCallback'));

// Tipo 3: Chamada a métodos de objetos
$obj = new MinhaClasse();
call_user_func(array($obj, 'meuMetodoCallback'));

// Tipo 4: Chamada a métodos estáticos
call_user_func('MinhaClasse::meuMetodoCallback');

// Tipo 5: Chamada relativa a métodos estáticos
class A {
    public static function quem() {
        echo "A\n";
    }
}

class B extends A {
    public static function quem() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::quem')); // A, descontinuado a partir do PHP 8.2.0

// Type 6: Objetos que implementam __invoke podem ser utilizados como callables
class C {
    public function __invoke($nome) {
        echo 'Olá ', $nome, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');
?>

Example #2 Exemplo de Callback utilizando uma Closure

<?php
// Nossa closure
$double = function($a) {
    return $a * 2;
};

// Esta é a série de números
$numbers = range(1, 5);

// O uso da closure aqui para
// dobrar o valor de cada elemento de nossa
// série
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
?>

O exemplo acima produzirá:

2 4 6 8 10

Note:

Callbacks registrados com funções como call_user_func() e call_user_func_array() não serão chamados se houver uma exceção não capturada que foi lançada em um callback anterior.