Callbacks / Callables

Callbacks podem ser representados pelo type hint callable a partir do PHP 5.4. Esta documentação usa o tipo callback para referenciar a mesma coisa.

Algumas funções como call_user_func() ou usort() aceitam funções de callback definidas pelo usuário como parametro. Funções de callback podem ser não 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 padrão 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.

Métodos estáticos também podem ser passadas sem a instância de um object dessa classe ao passar o nome da classe ao invés de um object no índice 0. A partir do PHP 5.2.3, também é possível utilizar 'NomeDaClasse::nomeDoMetodo'.

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

Exemplo #1 Exemplos de funções de callback

<?php 

// Exemplo de função de callback
function my_callback_function() {
    echo 
'hello world!';
}

// Exemplo de método de callback
class MyClass {
    static function 
myCallbackMethod() {
        echo 
'Hello World!';
    }
}

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

// Tipo 2: Chamada à métodos estáticos
call_user_func(array('MyClass''myCallbackMethod')); 

// Tipo 3: Chamada à metodos de objetos
$obj = new MyClass();
call_user_func(array($obj'myCallbackMethod'));

// Tipo 4: Chamada à métodos estáticos (a partir do PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Tipo 5: Chamada relativa à métodos estáticos (a partir do PHP 5.3.0)
class {
    public static function 
who() {
        echo 
"A\n";
    }
}

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

call_user_func(array('B''parent::who')); // A
?>

Exemplo #2 Exemplo de Callback utilizando uma Closure

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

// Este é a série de números
$numbers range(15);

// 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 irá imprimir:

2 4 6 8 10

Nota: No PHP 4, era necessário o uso de referencia para criar um callback que aponta realmente para o object, e não para uma cópia dele. Para maiores detalhes, veja Explicação sobre referências.

Nota:

Callbacks registrados com funções como call_user_func() e call_user_func_array() não serão chamados caso haja uma exceção não-pega lançada em um callback anterior.

add a note add a note

User Contributed Notes 5 notes

up
18
steve at mrclay dot org
2 years ago
Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.
up
19
andrewbessa at gmail dot com
2 years ago
You can also use the $this variable to specify a callback:

<?php
class MyClass {

    public
$property = 'Hello World!';

    public function
MyMethod()
    {
       
call_user_func(array($this, 'myCallbackMethod'));
    }

    public function
MyCallbackMethod()
    {
        echo
$this->property;
    }

}
?>
up
11
computrius at gmail dot com
1 year ago
When specifying a call back in array notation (ie. array($this, "myfunc") ) the method can be private if called from inside the class, but if you call it from outside you'll get a warning:

<?php

class mc {
   public function
go(array $arr) {
      
array_walk($arr, array($this, "walkIt"));
   }

   private function
walkIt($val) {
       echo
$val . "<br />";
   }

    public function
export() {
        return array(
$this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // will generate warning

?>

Output:
1<br />2<br />3<br />4<br />
Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22
up
3
metamarkers at gmail dot com
1 year ago
you can pass an object as a callable if its class defines the __invoke() magic method..
up
-1
Yzmir Ramirez
8 months ago
> As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'

You can also use 'self::methodName'.  This works in PHP 5.2.12 for me.
To Top