Resumo : neste tutorial, você aprenderá sobre o __invoke()
método mágico do PHP e como usá-lo de forma eficaz.
Introdução ao método mágico PHP __invoke()
Suponha que você tenha uma classe chamada MyClass
:
class MyClass
{
// ...
}
Linguagem de código: PHP ( php )
Normalmente, você cria uma nova instância do MyClass
e acessa seus métodos e propriedades assim:
$instance = new MyClass();
$instance->methodName();
Linguagem de código: PHP ( php )
Ou se MyClass
tiver métodos estáticos , você pode acessá-los usando o ::
operador:
MyClass::staticMethod();
Linguagem de código: PHP ( php )
Além de utilizar MyClass
essas formas, o PHP permite utilizar o objeto da classe como uma função . Por exemplo:
$instance($arguments);
Linguagem de código: PHP ( php )
Neste caso, o PHP chamará o __invoke()
método do arquivo MyClass
. Por exemplo:
<?php
class MyClass
{
public function __invoke(...$arguments)
{
echo 'Called to the __invoke method';
}
}
$instance = new MyClass;
$instance();
Linguagem de código: PHP ( php )
Saída:
Called to the __invoke method
Linguagem de código: PHP ( php )
O $instance
é conhecido como objeto de função ou functor.
O __invoke()
método mágico possui a seguinte sintaxe:
__invoke( ...$values): mixed
Linguagem de código: PHP ( php )
O PHP chamará o __invoke()
método mágico quando você chamar um objeto como uma função.
Além disso, o objeto da classe que implementa o __invoke()
método mágico pode ser chamado. Por exemplo:
echo is_callable($instance) ? 'yes' : 'no'; // yes
Linguagem de código: PHP ( php )
Neste exemplo, o $instance
do MyClass pode ser chamado. Isso significa que você pode passá-lo para qualquer função ou método que aceite um callable.
Exemplo prático de método mágico PHP __invoke()
Suponha que você tenha uma série de dados de clientes como este;
$customers = [
['id' => 1, 'name' => 'John', 'credit' => 20000],
['id' => 3, 'name' => 'Alice', 'credit' => 10000],
['id' => 2, 'name' => 'Bob', 'credit' => 15000]
];
Linguagem de código: PHP ( php )
Para classificar os clientes por nome ou crédito, você pode usar a usort()
função. O segundo parâmetro da usort()
função é uma chamada que determina a ordem de classificação:
usort(array &$array, callable $callback): bool
Linguagem de código: PHP ( php )
O seguinte define a classe Comparator
que implementa o __invoke()
método mágico:
<?php
class Comparator
{
private $key;
public function __construct(string $key)
{
$this->key = $key;
}
public function __invoke($a, $b)
{
return $a[$this->key] <=> $b[$this->key];
}
}
Linguagem de código: PHP ( php )
O __invoke()
método retorna o resultado da comparação de dois elementos do array por uma chave especificada.
Para usar a Comparator
classe, você pode criar uma nova instância da classe e passá-la para a usort()
função da seguinte maneira:
usort($customers, new Comparator('name'));
Linguagem de código: PHP ( php )
Esta instrução classifica os clientes por nome.
Para classificar os clientes por crédito, você pode usar o crédito como chave assim:
usort($customers, new Comparator('credit'));
Linguagem de código: PHP ( php )
Junte tudo.
<?php
class Comparator
{
private $key;
public function __construct(string $key)
{
$this->key = $key;
}
public function __invoke($a, $b)
{
return $a[$this->key] <=> $b[$this->key];
}
}
$customers = [
['id' => 1, 'name' => 'John', 'credit' => 20000],
['id' => 3, 'name' => 'Alice', 'credit' => 10000],
['id' => 2, 'name' => 'Bob', 'credit' => 15000]
];
// sort customers by names
usort($customers, new Comparator('name'));
print_r($customers);
// sort customers by credit
usort($customers, new Comparator('credit'));
print_r($customers);
Linguagem de código: PHP ( php )
Resumo
- Use o
__invoke()
método mágico invocado quando você chama um objeto como uma função. - Um objeto de uma classe que implementa
__invoke()
é conhecido como objeto de função ou functor. Também é exigível.