PHP__invoke

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 MyClasse acessa seus métodos e propriedades assim:

$instance = new MyClass();
$instance->methodName();Linguagem de código:  PHP  ( php )

Ou se MyClasstiver métodos estáticos , você pode acessá-los usando o ::operador:

MyClass::staticMethod();Linguagem de código:  PHP  ( php )

Além de utilizar MyClassessas 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 methodLinguagem 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): mixedLinguagem 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'; // yesLinguagem de código:  PHP  ( php )

Neste exemplo, o $instancedo 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 Comparatorque 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 Comparatorclasse, 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *