PHP Executar Dinamicamente Métodos Estáticos de uma Classe

class MyClass {
  public static function myFunc(bool $happy) {
    echo "\n";
    echo $happy ? 'I am happy' : 'I am sad';
  }
}

$class = MyClass::class;
$method = 'myFunc';
$arg = true;

$class::{$method}($arg);

Recentemente me deparei com uma situação inusitada… executar métodos estáticos de uma classe de forma dinâmica!

Ao escrever um teste unitário resolvi preparar a suite com Data Provider então naturalmente as opções deste data provider requeriam diferentes métodos para diferentes parâmetros, daí a solução natural foi parametrizar o próprio método como um dos parâmetros… na execução dos testes bastaria simplesmente chamar o método como fazemos com classes instanciáveis, certo?

Pois é, só que ao errar a sintaxe de execução eu acabei indo buscar artigos que explicassem como fazer isso com métodos estáticos e acabei indo para um caminho utilizando o call_user_func.

call_user_func([$class, $method], $arg);

A solução funciona bem e até tem uma sintaxe bastante limpa e bonita, nada contra, mas até o momento não encontrei necessidade real de lançar uso desta função.

Depois encontrei no próprio repositório outras implementações utilizando o call_user_func, só que aplicando uma sintaxe um pouco diferente concatenando a classe e método num único parâmetro.

call_user_func($class . '::' . $method, $arg);

Bom, considero a sintaxe do primeiro bloco a mais correta de ser aplicada como solução para este caso, afinal num mundo competitivo como o nosso, elegância é tudo!

World class technology S2 PHP.