Perché PHP non supporta l'overloading delle funzioni?

37

Mi chiedo se una delle caratteristiche chiave di un linguaggio di programmazione sia quella di avere la capacità di sovraccaricare le funzioni tramite argomenti. Penso che sia essenziale nel contesto della programmazione orientata agli oggetti.

È intenzionalmente lasciato indietro e non è permesso? O il sovraccarico non è una buona pratica?

    
posta user1179459 20.09.2012 - 06:21
fonte

2 risposte

33

Chi ti ha detto che PHP non supporta il sovraccarico di funzione? !!!

In realtà PHP supporta l'overloading delle funzioni, ma in un modo diverso. Le funzioni di overload di PHP sono diverse da quelle di Java:

PHP's interpretation of "overloading" is different than most object oriented languages. Overloading traditionally provides the ability to have multiple methods with the same name but different quantities and types of arguments.

Verifica i seguenti blocchi di codice.

Funzione per trovare la somma di n numeri:

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

Funzione per aggiungere due numeri o concatenare due stringhe:

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

Approccio orientato agli oggetti che include il sovraccarico del metodo:

Overloading in PHP provides means to dynamically "create" properties and methods. These dynamic entities are processed via magic methods one can establish in a class for various action types.

Rif: link

In PHP, sovraccaricare significa che puoi aggiungere membri oggetto in fase di esecuzione, implementando alcuni dei metodi magici come __set , __get , __call ecc.

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
    
risposta data 20.09.2012 - 09:36
fonte
11

Non un "supporto completo per il sovraccarico tradizionale", solo parziale .

A DEFINITION: "Traditional Overloading" provides, when calling method, the ability to have multiple methods with the same name but different quantities and types of arguments. For method declaration, it provides the option to express a separate/isolated declaration for each overloaded function.

Nota: la seconda parte di questa definizione è solitamente associata ai linguaggi di programmazione staticamente che eseguono il controllo dei tipi e / o controllo arità , per scegliere la dichiarazione corretta. PHP non è un linguaggio tipizzato staticamente, è dinamico e usa wash digitazione .

SUPPORTO PHP :

  • SÌ, offre la possibilità di chiamare più metodi con lo stesso nome ma diverse quantità . Vedi func_get_args e @rajukoyilandy answer, possiamo usare f(x) e f(x,y) .

  • SÌ, offre la possibilità di chiamare più metodi con lo stesso nome ma diversi tipi . Se uso interno di gettype nel metodo.

    • MA per i riferimenti ... Solo le variabili possono essere passate per riferimento, non puoi gestire un sovraccarico per il rilevamento costante / variabile.
  • NON offre la possibilità di dichiarare più metodi con lo stesso nome ma diverse quantità . Questo perché possiamo chiamare f(x) e f(x,y) con la stessa dichiarazione f .

  • NON offre la possibilità di dichiarare più metodi con lo stesso nome ma diversi tipi . Questo perché il compilatore PHP deve interpretare f($integer,$string) come la stessa funzione di f($string,$integer) .

Vedi anche la documentazione di overload di PHP5 per le spiegazioni del "sovraccarico non tradizionale".

    
risposta data 14.03.2013 - 15:06
fonte

Leggi altre domande sui tag