Por que o PHP não suporta sobrecarga de funções?


37

Gostaria de saber se um dos principais recursos de uma linguagem de programação é ter a capacidade de sobrecarregar funções por meio de argumentos. Eu acho que é essencial no contexto da programação orientada a objetos.

É intencionalmente deixado para trás e não é permitido? Ou sobrecarregar não é uma boa prática?


27
A sobrecarga de funções não é realmente um recurso da programação OO. A substituição da função de subclasse com o objetivo de polimorfismo é geralmente considerada uma característica necessária do OO - mas não a sobrecarga de função com base em argumentos. O Python também não possui sobrecarga de função baseada em argumento. De qualquer forma, a sobrecarga de funções é provavelmente mais prática em linguagens de tipo estatístico, em que a ligação de funções ocorre em tempo de compilação e é baseada no tipo de cada parâmetro de função.
Charles Salvia

2
@CharlesSalvia Essa seria uma boa resposta.
Kievlaluno # 20/12

11
O que ele disse. Além disso, a sobrecarga de função é superestimada. Você não precisa usar o mesmo nome de função para diferentes funções; apenas dê às suas funções nomes semelhantes, mas não idênticos. Operador sobrecarregando, por outro lado ...
Sr. Lister

Embora não seja uma resposta para uma pergunta específica, vou postar este link que me fez entender melhor COMO usar sobrecarga no PHP. Espero que ajude #
584 DiegoDD

Respostas:


33

Quem disse que o PHP não suporta sobrecarga de funções? !!!

Na verdade, o PHP suporta sobrecarga de funções, mas de uma maneira diferente. Os recursos de sobrecarga do PHP são diferentes dos de Java:

A interpretação do PHP de "sobrecarga" é diferente da maioria das linguagens orientadas a objetos. Tradicionalmente, a sobrecarga fornece a capacidade de ter vários métodos com o mesmo nome, mas com quantidades e tipos diferentes de argumentos.

Faça o check-out dos seguintes blocos de código.

Função para encontrar a soma dos n números:

function findSum() {
    $sum = 0;
    foreach (func_get_args() as $arg) {
        $sum += $arg;
    }
    return $sum;
}

echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75

Função para adicionar dois números ou concatenar duas cadeias:

function add() {
    //cross check for exactly two parameters passed
    //while calling this function
    if (func_num_args() != 2) {
        trigger_error('Expecting two arguments', E_USER_ERROR);
    }

    //getting two arguments
    $args = func_get_args();
    $arg1 = $args[0];
    $arg2 = $args[1];

    //check whether they are integers
    if (is_int($arg1) && is_int($arg2)) {
        //return sum of two numbers
        return $arg1 + $arg2;
    }

    //check whether they are strings
    if (is_string($arg1) && is_string($arg2)) {
        //return concatenated string
        return $arg1 . ' ' . $arg2;
    }

    trigger_error('Incorrect parameters passed', E_USER_ERROR);
}

echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World

Abordagem Orientada a Objetos, incluindo Sobrecarga de Método:

A sobrecarga no PHP fornece meios para "criar" dinamicamente propriedades e métodos. Essas entidades dinâmicas são processadas por métodos mágicos que podem ser estabelecidos em uma classe para vários tipos de ação.

Ref: http://php.net/manual/en/language.oop5.overloading.php

Em PHP, sobrecarregando significa que você pode adicionar membros de objetos em tempo de execução, através da implementação de alguns dos métodos mágicos como __set, __get, __calletc.

class Foo {

    public function __call($method, $args) {

        if ($method === 'findSum') {
            echo 'Sum is calculated to ' . $this->_getSum($args);
        } else {
            echo "Called method $method";
        }
    }

    private function _getSum($args) {
        $sum = 0;
        foreach ($args as $arg) {
            $sum += $arg;
        }
        return $sum;
    }

}

$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75

29
A segunda parte sobre o que o PHP chama de "sobrecarga" não é tão parecida. É apenas PHP usando um nome bem estabelecido para algo principalmente diferente, considerando que é PHP, não é tão surpreendente assim.
Phant0m

10
Isso não é sobrecarga de função. Para sobrecarregar verdadeiramente uma função, agora escreva o equivalente php de findSum(10, "steve", { 86, "2012-09-20" });. Uma verdadeira sobrecarga permitiria novos parâmetros de diferentes tipos.
Joel Etherton

3
@ JoelEtherton - a interpretação do PHP de "sobrecarga" é diferente da maioria das linguagens orientadas a objetos. Tradicionalmente, a sobrecarga fornece a capacidade de ter vários métodos com o mesmo nome, mas com quantidades e tipos diferentes de argumentos. ref: http://php.net/manual/en/language.oop5.overloading.php A sobrecarga no PHP fornece meios para "criar" dinamicamente propriedades e métodos. Essas entidades dinâmicas são processadas por métodos mágicos que podem ser estabelecidos em uma classe para vários tipos de ação.
rajukoyilandy

7
@rajukoyilandy: Está tudo muito bem, mas a pergunta do OP pergunta por que o PHP não implementa sobrecarga "tradicional". Sua resposta não aborda isso.
Joel Etherton

7
Isso não está sobrecarregando. Ainda existe apenas uma definição / declaração da função. Isso seria equivalente a va_list / va_arg em C ++. Você pode resolver alguns dos mesmos problemas? Sim. Mas ainda não está sobrecarregando.
Luke

13

Não é um suporte completo à "Sobrecarga tradicional", apenas parcial .

UMA DEFINIÇÃO : "Sobrecarga tradicional" fornece, ao chamar o método, a capacidade de ter vários métodos com o mesmo nome, mas com quantidades e tipos diferentes de argumentos. Para declaração de método , fornece a opção de expressar uma declaração separada / isolada para cada função sobrecarregada.

Nota: a segunda parte desta definição é geralmente associada a linguagens de programação com estaticamente que fazem verificação de tipo e / ou verificação de arity , para escolher a declaração correta. O PHP não é uma linguagem estaticamente digitada, é dinâmica e usa digitação fraca .


SUPORTE PHP :

  • SIM, fornece a capacidade de chamar vários métodos com o mesmo nome, mas com quantidades diferentes . Veja func_get_args e resposta @rajukoyilandy, podemos usar f(x)e f(x,y).

  • SIM, fornece a capacidade de chamar vários métodos com o mesmo nome, mas com tipos diferentes . Veja o uso interno do gettype no método.

    • MAS para referências ... Somente variáveis ​​podem ser passadas por referência, você não pode gerenciar uma sobrecarga para detecção constante / variável.
  • NÃO fornece a capacidade de declarar vários métodos com o mesmo nome, mas com quantidades diferentes . Isso ocorre porque podemos ligar f(x)e f(x,y)com a mesma fdeclaração.

  • NÃO fornece a capacidade de declarar vários métodos com o mesmo nome, mas com tipos diferentes . Isso ocorre porque o compilador PHP deve interpretar f($integer,$string) como a mesma função que f($string,$integer).

Veja também a documentação de sobrecarga do PHP5 para obter as explicações sobre "sobrecarga não tradicional".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.