Sobrecarga significa que um elemento pode se comportar como outros e desempenhar várias funções.
PHP não implementa a sobrecarga por causa de sua natureza bastante dinâmica combinado com sua tipagem fraca.
O PHP nos dá três métodos que “auxiliam” a criação de uma sobrecarga. Ela não é natural, mas ainda assim pode ser realizada. Os métodos são: func_get_arg, func_get_args, func_num_args.
func_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();
}
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.
Nesse exmplo, dentro da função sobrecargaUm é chamada a função func_num_args() para saber o número de argumentos e depois é usado a função func_get_arg(0) para adicionar o valor do argumento à variável.
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.
Nesse exemplo, ele usa o método is_numeric() para saber o tipo do argumento
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);