¿Por qué PHP no admite la sobrecarga de funciones?

37

Me pregunto si una de las características clave de un lenguaje de programación es tener la capacidad de sobrecargar funciones mediante argumentos. Creo que es esencial en el contexto de la programación orientada a objetos.

¿Se deja intencionalmente atrás y no se permite? ¿O la sobrecarga no es una buena práctica?

usuario1179459
fuente
27
La sobrecarga de funciones no es realmente una característica de la programación OO. La anulación de funciones de subclase con el propósito de polimorfismo generalmente se considera una característica necesaria de OO, pero no la sobrecarga de funciones basada en argumentos. Python tampoco tiene una sobrecarga de funciones basada en argumentos. De todos modos, la sobrecarga de funciones es probablemente más práctica en lenguajes de tipo estático donde el enlace de funciones ocurre en tiempo de compilación y se basa en el tipo de cada parámetro de función.
Charles Salvia
2
@CharlesSalvia Esa sería una buena respuesta.
kiamlaluno
1
Lo que dijo. Además, la sobrecarga de funciones está sobrevalorada. No tiene que usar el mismo nombre de función para diferentes funciones; simplemente asigne a sus funciones nombres que sean similares pero no idénticos. Operador sobrecargado por otro lado ...
Mr Lister
Aunque no es una respuesta a la pregunta específica, publicaré este enlace que me hizo comprender mejor CÓMO usar la sobrecarga en PHP. espero que ayude
DiegoDD

Respuestas:

33

¿Quién te dijo que PHP no admite la sobrecarga de funciones?

En realidad, PHP admite la sobrecarga de funciones, pero de una manera diferente. Las características de sobrecarga de PHP son diferentes de las de Java:

La interpretación de PHP de "sobrecarga" es diferente a la mayoría de los lenguajes orientados a objetos. La sobrecarga tradicionalmente proporciona la capacidad de tener múltiples métodos con el mismo nombre pero diferentes cantidades y tipos de argumentos.

Verifique los siguientes bloques de código.

Función para encontrar la suma de 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

Función para agregar dos números o para concatenar dos cadenas:

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

Enfoque orientado a objetos, incluida la sobrecarga de métodos:

La sobrecarga en PHP proporciona medios para "crear" dinámicamente propiedades y métodos. Estas entidades dinámicas se procesan mediante métodos mágicos que uno puede establecer en una clase para varios tipos de acciones.

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

En PHP, medios sobrecarga puede agregar miembros de objetos en tiempo de ejecución, mediante la implementación de algunos de los 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
rajukoyilandy
fuente
29
La segunda parte de lo que PHP llama "sobrecarga" no es tan similar. Es solo PHP que usa un nombre bien establecido para algo en su mayoría diferente, considerando que es PHP, sin embargo, no es tan sorprendente.
phant0m
10
Eso no es sobrecarga de funciones. Para sobrecargar realmente una función, ahora escriba el equivalente php de findSum(10, "steve", { 86, "2012-09-20" });. Una verdadera sobrecarga permitiría nuevos parámetros de diferentes tipos.
Joel Etherton
3
@JoelEtherton: la interpretación de PHP de "sobrecarga" es diferente a la mayoría de los lenguajes orientados a objetos. La sobrecarga tradicionalmente proporciona la capacidad de tener múltiples métodos con el mismo nombre pero diferentes cantidades y tipos de argumentos. ref: http://php.net/manual/en/language.oop5.overloading.php La sobrecarga en PHP proporciona medios para "crear" dinámicamente propiedades y métodos. Estas entidades dinámicas se procesan mediante métodos mágicos que uno puede establecer en una clase para varios tipos de acciones.
rajukoyilandy
77
@rajukoyilandy: Eso está muy bien, pero la pregunta de OP pregunta por qué PHP no implementa la sobrecarga "tradicional". Su respuesta no aborda eso.
Joel Etherton
77
Esto no se está sobrecargando. Todavía hay una sola definición / declaración de la función. Esto sería equivalente a va_list / va_arg en C ++. ¿Puedes resolver algunos de los mismos problemas? Sí. Pero todavía no se está sobrecargando.
Lucas
13

No es un soporte completo de "sobrecarga tradicional", solo parcial .

UNA DEFINICIÓN : "Sobrecarga tradicional" proporciona, al llamar al método, la capacidad de tener múltiples métodos con el mismo nombre pero diferentes cantidades y tipos de argumentos. Para la declaración del método , proporciona la opción de expresar una declaración separada / aislada para cada función sobrecargada.

Nota: la segunda parte de esta definición generalmente se asocia con lenguajes de programación de tipo estático que hacen verificación de tipo y / o verificación de aridad , para elegir la declaración correcta. PHP no es un lenguaje de tipo estático, es dinámico y utiliza un tipo de letra débil .


APOYO PHP :

  • SÍ, proporciona la capacidad de llamar a varios métodos con el mismo nombre pero con diferentes cantidades . Ver func_get_args y @rajukoyilandy respuesta, podemos usar f(x)y f(x,y).

  • SÍ, proporciona la capacidad de llamar a varios métodos con el mismo nombre pero con diferentes tipos . Se uso interno de gettype en el método.

    • PERO para referencias ... Solo se pueden pasar variables por referencia, no se puede gestionar una sobrecarga para detección constante / variable.
  • NO proporciona la capacidad de declarar múltiples métodos con el mismo nombre pero diferentes cantidades . Esto se debe a que podemos llamar f(x)y f(x,y)con la misma fdeclaración.

  • NO proporciona la capacidad de declarar múltiples métodos con el mismo nombre pero con diferentes tipos . Esto se debe a que el compilador PHP debe interpretar f($integer,$string) como la misma función que f($string,$integer).

Consulte también la documentación de sobrecarga de PHP5 para las explicaciones de "sobrecarga no tradicional".

Peter Krauss
fuente