Llamar a un método de forma dinámica en PHP
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]);