Argomenti variabili e di default in Javascript, Actionscript e PHP

mercoledì 7 maggio, 2008

Chi sviluppa sa bene che una delle caratteristiche delle funzioni (function () ) è quella di avere o meno degli argomenti di input. Può capitare, a volte, di dover scrivere una funzione che, in base ai parametri di input, si comporta in modo differente (in programmazione OO troviamo questo comportamento indicato come poliformismo). I parametri variabili (varargs), introdotti già all’epoca del C e presenti di default nella classica dichiarazione del main:

1
int main(int argc, char *argv[]);

non vanno però confusi con l’impostazione di default di un parametro, adesso pienamente supportata anche Actionscript 3.0.

Argomenti di default

Ad esempio in PHP è possibile definire una funzione in questo modo:

1
2
3
function pluto ( $a, $b = 5 ) {
    // todosomethink
}

il parametro $b è opzionale, cioè se non viene passato durante la chiamata alla funzione assumerà per default il valore di 5.

Come anticipato anche Actionscript 3.0 ora supporta pienamente questo sistema:

In ActionScript 3.0 è stata introdotta la possibilità di dichiarare dei valori di parametro predefiniti per una funzione. Se in una chiamata a una funzione con parametri predefiniti viene omesso un parametro con valori predefiniti, viene utilizzato il valore specificato per quel parametro nella definizione della funzione. Tutti i parametri con valori predefiniti devono essere posizionati alla fine dell’elenco dei parametri. I valori assegnati come predefiniti devono essere costanti della fase di compilazione. L’esistenza di un valore predefinito per un parametro fa sì che quel parametro diventi un parametro opzionale, mentre un parametro privo di valore predefinito viene considerato un parametro obbligatorio.

La stessa cosa vale anche per PHP: un parametro con valore preimpostato di venta opzionale.

In Actionscript 3.0, similmente all’esempio in PHP esposto più sopra, è possibile preimpostare i parametri di input in questo modo:

1
2
3
function pluto(a:int, b:int = 5):void {
    // todosomethink
}

Anche in questo caso il secondo parametro b diventa automaticamente opzionale.

In Javascript, purtroppo, questa caratteristiche non è – ancora – supportata. Anche se ci sono alcune “arzigogolate” tecniche (vedi ad esempio Default Arguments in JavaScript Functions) per simulare o aggirare l’ostacolo, l’uso di questa tecnica in Javascript è davvero limitato.

Parametri variabili

Questa tecnica, a differenza della precedente, permette di esaminare il contenuto e la presenza dei parametri di input di una funzione. Risulta evidente che questo modo di procedere può essere utilizzato anche per impostare parametri mancanti. In PHP, ad esempio, abbiamo tre semplici funzioni in grado di operare sui parametri di input: func_num_args(), func_num_args() e func_get_arg(). Queste funzione permettono rispettivamente di restituire il numero degli argomenti, restituire un array con tutti gli elementi di input, recuperare un elemento specifico di input. Ad esempio:

1
2
3
function pluto() {
    echo 'Numero argomenti passati = '.func_num_args();
}

Restituirà il numero degli argomenti passati alla funzione pluto. Nell’esempio qui sotto, invece, si vede come una funzione può variare il suo comportamento in base al numero (e anche al tipo – polimofica) dei suo parametri. In questo caso se chiamiamo pluto() con due o più parametri viene visualizzato il messaggio altrimento no.

1
2
3
4
function pluto() {
    if( func_num_args() > 2 )
        echo 'Il secondo parametro è '.func_get_arg(1); // essendo in base 0
    }

Questo permette anche di “simulare” una impostazione di default dei parametri, anche se visto che PHP la supporta nativa e comunque più comoda quella esposta precedentemente. Tuttavia ecco un esempio per chiarire:

1
2
3
4
5
function pluto() {
    if( !isset( func_get_arg(1) ) ) {
        // il secondo parametro non è stato passato
    }
}

oppure:

1
2
3
4
5
function pluto() {
    if( func_num_args() < 2 ) {
        // il secondo parametro non è stato passato
    }
}

In Actionscript e Javascript abbiamo una situzione simile:

1
2
3
4
5
6
7
function pluto() {
    trace ( 'Numero argomenti passati = ' + arguments.length );
    // stampa tutti gli argomenti
    for (var i:uint = 0; i < arguments.length; i++) {
        trace( arguments[i] );
    }
}

in Javascript:

1
2
3
4
5
6
7
8
9
function pluto() {
    alert ( 'Numero argomenti passati = ' + arguments.length );
    // stampa tutti gli argomenti
    var o = '';
    for (var i = 0; i < arguments.length; i++) {
        o += arguments[i] + '\n';
    }
    alert( o );
}

Essendo ECMA, Actionscript e Javascript si assomigliano moltissimo, sfruttando entrambi un oggetto arguments che fornisce poi varie informazioni.

Post correlati

Questo articolo ti è stato utile?: Per nientePocoAbbastanzaMoltoMoltissimo
Loading ... Loading ...

2 commenti a: “Argomenti variabili e di default in Javascript, Actionscript e PHP”

  1. 11 giu, 2008 Argomenti variabili in Actionscript 3.0 | Undolog.com:

    [...] post Argomenti variabili e di default in Javascript, Actionscript e PHP avevo esposto l’uso delle tecniche di passaggio di parametri variabili e di default. Aggiungo, ora, [...]

  2. 05 gen, 2009 Wordpress: wp_parse_args() | Undolog.com:

    [...] nelle funzioni WordPress ed è utile quando una funzione supporta più paramteri. Come indicato in Argomenti variabili e di default in Javascript, Actionscript e PHP, non sarebbe necessario passare i parametri nella modalità [...]

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre>                                  // blocco generico
<code></code>                                // blocco generico
[cc_actionscript][/cc_actionscript]          // Actionscript
[cc_actionscript3][/cc_actionscript3]        // Actionscript 3
[cc_css][/cc_css]                            // CSS Style Sheet
[cc_html][/cc_html]                          // HTML
[cc_js][/cc_js]                              // Javascript
[cc_objc][/cc_objc]                          // Objective-C
[cc_php][/cc_objc]                           // PHP
[cc_sql][/cc_sql]                            // SQL