Se você quiser para a porta antiga API processual somente para um novo brilhante orientada a objetos de moda, uma classe de proxy é a sua solução.
Por exemplo, iremos expor a antiga chamada procedural para o lib cURL com uma API auto-contida orientada a objetos.
Na documentação do PHP para cURL lib:
http://www.php.net/manual/en/ref.curl.php
, podemos ver que todas as funções cURL começam com curl_ e todas elas (apenas exceção para curl_init e curl multi init ) deseja o recurso curl como seu primeiro parâmetro.
Começamos a construir uma classe de contêiner para armazenar o recurso curl atual como uma propriedade privada:
class cURL {
private $curl = null;
}
e escrevemos um método mágico __call para chamadas de proxy para sua versão procedural, com o prefixo “curl_” omitido para o açúcar sintático.
public function __call($n,$p){
if($n=='init' || $n=='multi_init'){
return $this->curl =
call_user_func_array('curl_'.$n,$p);
} else {
array_unshift($p,$this->curl);
return call_user_func_array('curl_'.$n,$p);
}
}
Agora adicionamos um construtor à nossa classe para inicializar o recurso
public function __construct($url = null){
return $this->init($url);
}
E finalmente temos nossa aula completa:
class cURL {
private $curl = null;
public function __construct($url = null){
return $this->init($url);
}
public function __call($n,$p){
if($n=='init' || $n=='multi_init'){
// Close resource if opened
if($this->curl) curl_close($this->curl);
return $this->curl = call_user_func_array('curl_'.$n,$p);
} else {
array_unshift($p,$this->curl);
return call_user_func_array('curl_'.$n,$p);
}
}
}
E este é um exemplo de uso
$http = new cURL("http://graph.facebook.com/CaffeinaLab");
$http->setopt(CURLOPT_HEADER, 0);
$http->setopt(CURLOPT_RETURNTRANSFER, 1);
echo $http->exec();
$http->close();
Você pode encontrar a aula e o exemplo aqui:
https://gist.github.com/lastguest/4740772