Nesta segunda parte da série vou apresentar como é possível criar um método que possa identificar os parâmetros recebidos de acordo com os tipos de variáveis.
Exemplo
Deseja-se criar um método para obter determinado usuário em um sistema. Entretanto, essa busca pode ser feita de duas maneiras: através do nome do usuário ou pelo seu ID. Ao invés de criarmos um método chamado getUserById() e outro getUserByName(), podemos simular o recurso de sobrecarga para criarmos apenas um método, que será chamado somente de getUser(). Na prática, teríamos o seguinte:
No primeiro caso, a obtenção de um usuário seria feita dessa forma:
$user = $object->getUserByName("Pedro Padron");
$other_user = $object->getUserById(1);
Já no segundo caso, simulando sobrecarga teríamos:
$user = $object->getUser("Pedro Padron");
$other_user = $object->getUser(1);
Como isso pode ser feito?
Para implementar essa solução específica, recomendo que sejam criados três métodos:
acesso nome descrição
public getUser() método que servirá de ‘fachada’ para obter um usuário
private _getUserById() busca o usuário pelo id
private _getUserByName() busca o usuário pelo nome
Mas por que devo criar 3 métodos se esse recurso me permite utilizar apenas um?
O mais interessante desse recurso é poder criar uma simples fachada para quem precisar obter usuários do sistema, realizando essa operação através de “um único ponto de entrada”. Por razões organizacionais, o método getUser() é o único que será visível externamente, pois ele será responsável por analisar o valor passado como parâmetro e direcionar a requisição para o método correto. Dessa forma evitamos colocar no mesmo método o tratamento de parâmetros e a lógica envolvida nas operações de busca (facilita o entendimento e a manutenção).
Finalmente o Código!
Para que o nosso método “fachada” possa identificar o parâmetro recebido e redirecionar a requisição, vamos utilizar as funções de identificação de tipos de variáveis disponíveis no PHP. Abaixo segue uma lista de algumas delas:
is_array()
is_string()
is_int()
is_bool()
is_float()
entre outras…
Uma lista completa dessas funções pode ser encontrada na seção “Variáveis” do Manual do PHP: http://www.php.net/manual/pt_BR/ref.variables.php
Como nós só queremos identificar se o parâmetro é uma string ou um inteiro, utilizaremos apenas duas dessas funções: is_string() e is_int().
Observação: Note que sempre que ocorrer algum erro ou se o usuário não for encontrado os métodos retornarão um array vazio. Isso foi feito apenas para simplificar o exemplo. É altamente recomendável que você faça a distinção entre erros nos parâmetros e erros nas consultas.
class Teste {
// armazenará um array contendo as informações dos usuários.
// em uma situação real, esses dados poderão vir de qualquer outra fonte.
private $_users;
function __construct() {
// inicializa o array, onde a chave é o ID e o valor é o NOME DO USUÁRIO
$this->_users = array(0 => "Max Stirner",
1 => "Emma Goldman",
2 => "Aldous Huxley",
3 => "George Orwell",
4 => "Noam Chomsky");
}
function getUser($param) {
if (is_string($param)) {
// se for string, busca por nome
$user = $this->_getUserByName($param);
} else if (is_int($param)) {
// se for int, busca por id
$user = $this->_getUserById($param);
} else {
// se nenhuma condição for satisfeita, retorna um array vazio
$user = array();
}
return $user;
}
private function _getUserById($id) {
if (isset($this->_users[$id])) {
// se existir o índice (id), monta o array do usuário
$user = array("id" => $id, "username" => $this->_users[$id]);
} else {
// se não existir, retornará um array vazio
$user = array();
}
return $user;
}
private function _getUserByName($name) {
// busca pelo nome no array de usuários
$id = array_search($name, $this->_users);
if ($id != null) {
// se encontrou, monta o array do usuário
$user = array("id" => $id, "username" => $this->_users[$id]);
} else {
// se não encontrou, retornará null
$user = array();
}
return $user;
}
}
Testando o Código
Para testar o funcionamento dos métodos, você pode utilizar este código:
// instancia um objeto da classe Teste
$obj = new Teste();
// busca o usuário com ID = 1
print_r($obj->getUser(1));
// busca o usuário Aldous Huxley
print_r($obj->getUser("Aldous Huxley"));
// busca o usuário com ID = 3
print_r($obj->getUser(3));
// note que aqui tentamos passar como parâmetro o ID do usuário, mas por estar entre
// aspas o PHP o interpreta como string. tome muito cuidado com isso, principalmente
// se os valores que devem ser usados como inteiros vêm de outras fontes (ex.: banco de dados).
print_r($obj->getUser("4"));
// para evitar esse tipo de problema, utilize a função intval()
print_r($obj->getUser(intval("4")));
Executando este código, o resultado obtido será:
[cor4]Array ([/cor4]
[cor4] [id] => 1[/cor4]
[cor4] [username] => Emma Goldman[/cor4]
[cor4])[/cor4]
[cor4]Array[/cor4]
[cor4]([/cor4]
[cor4] [id] => 2[/cor4]
[cor4] [username] => Aldous Huxley[/cor4]
[cor4])[/cor4]
[cor4]Array[/cor4]
[cor4]([/cor4]
[cor4] [id] => 3[/cor4]
[cor4] [username] => George Orwell[/cor4]
[cor4])[/cor4]
[cor4]Array[/cor4]
[cor4]([/cor4]
[cor4])[/cor4]
[cor4]Array[/cor4]
[cor4]([/cor4]
[cor4] [id] => 4[/cor4]
[cor4] [username] => Noam Chomsky[/cor4]
[cor4])[/cor4]
Note que o quarto array está vazio, pois o parâmetro passado foi uma string contendo o ID, o que foi interpretado como o nome do usuário.
Finalizando…
Lembre-se de manter a organização ao utilizar esse pequeno ‘truque’ em suas aplicações. Por não ser um recurso suportado pelo PHP, implementar sobrecarga de métodos pode resultar em códigos extremamente bagunçados, que vão piorando conforme o sistema cresce.
No próxima e última parte desta série de artigos, continuarei abordando sobrecarga através dos tipos de parâmetros, mas desta vez utilizando objetos ao invés de tipos simples de variáveis. Se você está sem paciência para aguardar o próximo, sugiro que dê uma olhada na função is_object() e no operador instanceof.
Downloads
Código PHP (exemplo): http://downloads.padron.blog.br/artigos/sobrecarga/sobrecarga2.zip
Artigo em PDF: http://downloads.padron.blog.br/artigos/sobrecarga/sobrecarga2.pdf