Llamar a un método de forma dinámica en PHP

Teniendo una variable que tiene el nombre del método al que queremos llamar, es muy fácil llamar a este método de forma dinámica.

Llamar a un método de forma dinámica en PHP
Photo by Markus Spiske / Unsplash

Este es un tip muy pequeño pero que me ha salvado en más de una ocasión.

Supongamos que queremos hacer una petición HTTP a través de nuestro cliente. Vamos a suponer que tenemos la siguiente clase:

class Http {
    public function __construct(
        private HttpClientInterface $client
    ) {
        //
    }
    
    public function get(string $url, array $query = [])
    {
        return $this->client->get($url, $query);
    }
    
    public function post(string $url, array $body = [])
    {
        return $this->client->post($url, $body);
    }
    
    public function put(string $url, array $body = [])
    {
        return $this->client->put($url, $body);
    }
    
    public function patch(string $url, array $body = [])
    {
        return $this->client->patch($url, $body);
    }
    
    public function delete(string $url, array $body = [])
    {
        return $this->client->delete($url, $body);
    }
}

Ahora, si quisiéramos hacer peticiones podríamos tener un código así:

$method = $this->getPreferredMethod();
$client = new Http(new HttpClient());

switch ($method) {
    case 'GET':
        $response = $client->get($url, $data);
        break;
    case 'POST':
        $response = $client->post($url, $data);
        break;
    case 'PUT':
        $response = $client->put($url, $data);
        break;
    case 'PATCH':
        $response = $client->patch($url, $data);
        break;
    case 'DELETE':
        $response = $client->delete($url, $data);
        break;
}

Sin embargo, ya que nuestra variable $method contiene el nombre del método que queremos llamar, podemos llamar a un método de forma dinámica de la siguiente forma:

$method = $this->getPreferredMethod();
$method = strtolower($method);
$client = new Http(new HttpClient());
$response = $client->$method($url, $data);

De hecho, hay 3 formas de llamar a un método de forma dinámica en PHP:

$response = $client->$method($url, $data);
$response = $client->{$method}($url, $data);
$response = call_user_func_array([$client, $method], [$url, $data]);