quarta-feira, 7 de março de 2012

Sobrecarga de métodos - PHP OO


O que é sobrecarga?
Sobrecarga é um dos fundamentos da programação orientada à objetos e significa que um elemento pode realizar vários métodos/funções com o mesmo nome.
Como Utilizar?
O PHP por ser uma linguagem de natureza dinâmica e tipagem fraca, não permite uma implementação "nativa" de sobrecarga, porém é possível utilizando alguns métodos que auxiliam a sua criação.
Os métodos são: "func_get_arg", "func_get_args", "func_num_args".
nc_get_arg
Esta função permite que você recupere o valor de um argumento passado como parâmetro na chamada do método.
public function sobrecarga() {
    return $argumento = func_get_arg(0);
}

func_get_args

Esta função retorna um vetor com todos os argumentos passados como parâmetro na chamada do método.
public function sobrecarga() {
    var_dump(func_get_args());
}

func_num_args

Esta função retorna um inteiro que representa a quantidade de argumentos passados como parâmetro ao seu método.
public function sobrecarga() {
    return $quantidade = func_num_args();
}

Como Utilizar?

Agora que já apresentamos as funções que serão utilizadas, veremos como se implementa a sobrecarga no PHP.
A sobrecarga que irei mostrar será de dois tipos: sobrecarga por quantidade de parâmetros e sobrecarga por tipo de parâmetros.

Sobrecarga por quantidade

Para implementar este tipo de sobrecarga, basta escrever um método (sem argumentos) e na implementação deste método o método func_num_args será chamado para verificarmos com quantos parâmetros estamos trabalhando.

class Sobrecarga {
    public function sobrecargaUm() {
        if (func_num_args() == 2) {
            $this->_metodoChamadoComDoisArgumenos(
                func_get_arg(0), func_get_arg(1)
            );
        } else if (func_num_args() == 3) {
            $this->_metodoChamadoComTresArgumentos(
                func_get_arg(0), func_get_arg(1), func_get_arg(2)
            );
        } else {
            throw new Exception("Número de argumentos inválido");
        }
    }
}
$sobrecarga = new Sobrecarga();
$sobrecarga->sobrecargaUm("Hello","World");
$sobrecarga->sobrecargaUm("Hello","World", "Again");

Sobrecarga por tipo

Para implementar este tipo de sobrecarga basta recuperar os argumentos passados por parâmetros e testar o tipo de cada um deles.
class Sobrecarga {
    public function sobrecargaDois() {
        if (func_num_args() == 1) {
            if (is_numeric(func_get_arg(0)) {
                $this->_metodoSeArgumentoNumerico(func_get_arg(0));
            } else {
                $this->_metodoSeArgumentoString(func_get_arg(0));
            }
        } else {
            throw new Exception("Número de argumentos inválido");
        }
    }
}
$sobrecarga = new Sobrecarga();
$sobrecarga->sobrecargaDois("Hello");
$sobrecarga->sobrecargaDois(21);

Matéria baseada em: 
Acessado em: 07/03/2012

0 comentários:

Postar um comentário