A linguagem PHP, em relação a sobrecarga de métodos, é diferente outras linguagem
como Java, C# e Vb.Net. Nessas linguagens, realizamos a sobrecarga de forma natural
e intuitiva, mantendo-se os métodos com os mesmos nomes e variando o número
de parâmetros e seus tipos.
//exemplo em Java
class Teste {
public void metodo1(){
//omitido
}
public void metodo1(int param){
//omitido
}
public void metodo1(int param, String param2){
//omitido
}
}
A linguagem PHP não permite tal forma de sobrecarga. Para atingirmos o mesmo
resultado precisamos implementar o método especial chamado de __call.
Sintaxe
__call($name, $arguments){
//corpo
}
Onde
$name: nome do método invocado
$arguments: argumentos passados para método $name
O método especial acima é executado, quando declarado em um classe, automaticamente quando tentamos acessar
um método inacessível, ou que não existe, de um objeto.
Exemplo 5
//MinhaClasse.php
<?php
class MinhaClasse {
public function __call(string $name, array $arguments)
{
echo "__call: ",$name,"\n"; //
var_dump($arguments);
}
}
?>
//main.php
<?php
include("MinhaClasse.php");
$obj = new MinhaClasse();
$obj->metodo1(); //sem argumento
$obj->metodo1(1,"string"); //com argumento
?>
Saída
__call: metodo1
array(0) {
}
__call: metodo1
array(2) {
[0]=>
int(1)
[1]=>
string(6) "string"
}
Implementando o método __call, esse servirá de ponte para a execução da chamada de outros métodos com
diferentes números de argumentos.
Os métodos para a simulação da sobrecarga devem ser declarados com o modificador de
acesso private para que nenhuma classe possa acessá-los.
Com auxílio das funções array_keys e também count podemos trabalhar
com os argumentos passados para o métodos __call.
Sintaxe
array_keys(array $array): array
Sintaxe
count(Countable|array $value, int $mode = COUNT_NORMAL): int
Exemplo 6
//MinhaClasse.php
<?php
class MinhaClasse
{
private function metodo1() {
echo "metodo1() invocado.","\n";
}
private function metodo2($param) {
echo "metodo2() invocado.","\n";
echo " param: \"$param\"";
}
//mC)todo usado como ponte para "sobrecarga"
public function __call($name, $arguments)
{
$chaves = array_keys($arguments); //array de argumentos
$args = count($arguments); //nC:mero de argumentos passados
if ($name == "metodo1")
{
if($args == 0)
$this->metodo1();
if($args > 0)
$this->metodo2($arguments[$chaves[0]]);
}
}
}?>
//main.php
<?php
include("MinhaClasse.php");
$obj = new MinhaClasse();
$obj->metodo1(); //método1
$obj->metodo1("string"); //método2 indiretamente
?>
Saída
metodo1() invocado.
metodo2() invocado.
param: "string"
O exemplo 6 acima foi feito apenas como caracter ilustrativo da simulação de
sobrecarga discutida, não sendo uma solução final.