Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957

    funzioni... sovraccarico?

    Ciao, volevo sapere se in PHP c'è qualche modo per sovraccaricare una funzione come ad ex. in java:

    è possibile fare un funzione definita in due modi:
    function check($data){...}
    function check() {...}
    in modo che faccia il primo check se invoco
    check("Testo");
    oppure il secondo se faccio solo
    check();
    E' possibile?

    grazie, ciao

  2. #2
    non penso proprio, però puoi usare dei paramentri predefiniti!

    Codice PHP:
    function pippo($param false){

    if(
    $param) echo "$param è impostato"; else echo "$param non è impostato";

    }

    //poi puoi richiamare:
    pippo();
    //oppure
    pippo("cacca"); 

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    in questo caso param ha valore predefinito FALSE a meno che non arrivi qualcosa passato col metodo giusto?

  4. #4
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754
    L'overloading in php in senso stretto non esiste ma ci si avvicina molto. Oltre all'esempio di flacchio ti ricordo che $data, non essendo tipizzato, può essere qualsiasi 'cosa' e che puoi controllarne il tipo al momento dell'esecuzione.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    957
    ok, ma se io faccio
    funz();
    e la funzione è definita come funz($param) param che valore assumerà?

  6. #6
    Utente di HTML.it L'avatar di JHammer
    Registrato dal
    Sep 2004
    Messaggi
    754
    [supersaibal]Originariamente inviato da GoldEmish
    ok, ma se io faccio
    funz();
    e la funzione è definita come funz($param) param che valore assumerà? [/supersaibal]
    Provato?
    OK...per risolvere l'inconveniente basta che dichiari la funzione con un valore di default come flacchio aveva scritto(valori come null o false per esempio).

  7. #7
    Con PHP 5 è possibile simulare l'overloading dei metodi di un oggetto attraverso l'uso del metodo speciale __call().
    Se in una classe è definito questo metodo, esso sarà richiamato ogni volta che verrà invocata l'esecuzione di un metodo non definito. __call() quindi è un metodo che intercetta tutte le chiamate di metodi di una classe che non vanno a buon fine. Il PHP passa a __call() il nome del metodo chiamato ed un array contenente i parametri passati.
    L'overloading di un metodo può essere quindi realizzato attraverso una sorta di smistatore di chiamate da realizzare all'interno di __call(). Questo smistatore deve essere in grado di riconoscere il tipo e il numero dei parametri passati e deve lanciare la routine più appropriata alla loro gestione.

    L'esempio che segue realizza l'overloading del metodo somma() al quale si potranno passare sia interi,sui quali verrà effettuata una somma algebrica, sia stringhe, che verranno invece concatenate. Potranno essere passati un numero qualsiasi di parametri, anche nessuno.

    Codice PHP:
    <?php
    class sommatore
    {
        function 
    __call($m$a)    {
            if(
    $m == 'somma') {
            
    $num_par count($a);
            if(!
    $num_par) {
                echo 
    'Nessun paramentro passato',"\n\n";
            } else {
                if(
    $this->sono_interi($a)) {
                    echo 
    'Tipo parametri passati: interi (',implode(', ',$a),")\n";
                    echo 
    'risultato: ',array_reduce($a,array($this,'somma_numeri')),"\n\n";
                } else {
                    echo 
    'Tipo parametri passati: stringhe e/o interi (',implode(', ',$a),")\n";
                    echo 
    'risultato: ',array_reduce($a,array($this,'somma_stringhe')),"\n\n";
                }
            }
            }
            else 
                echo 
    "Il metodo '$m' non è definito \n\n";
        }

        function 
    somma_numeri($v$w) {
            
    $v += $w;
            return 
    $v;
        }

        function 
    somma_stringhe($v$w) {
            
    $v .= $w;
            return 
    $v;
        }

        function 
    sono_interi($a) {
            foreach (
    $a as $value) {
                if (!
    is_int($value)) return false;
            }
            return 
    true;
        }
    }

    $mioSommatore = new sommatore();
    $mioSommatore->somma();
    $mioSommatore->somma(1);
    $mioSommatore->somma(3,5);
    $mioSommatore->somma('Concatena',' stringa');
    $mioSommatore->ciccio();
    ?>
    il risultato sarà:
    codice:
    Nessun paramentro passato
    
    Tipo parametri passati: interi (1)
    risultato: 1
    
    Tipo parametri passati: interi (3, 5)
    risultato: 8
    
    Tipo parametri passati: stringhe e/o interi (Concatena,  stringa)
    risultato: Concatena stringa
    
    Il metodo 'ciccio' non è definito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.