PHP: API procedural para orientada a objetos

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