2011-01-08 9 views
7

Supponiamo di avere una funzione/metodo F() che accetta 3 parametri $ A, $ B e $ C definiti come questo.i parametri di funzione php possono essere passati in ordine diverso come definito nella dichiarazione

function F($A,$B,$C){ 
    ... 
} 

Supponiamo che io non voglio seguire l'ordine di passare i parametri, invece posso fare una chiamata del genere?

F($C=3,$A=1,$B=1); 

invece di

F(1,2,3) 
+0

Non fraintendetemi, ma, qual è il punto di questo quando il codice prodotto sarà completamente pasticcio? – Ben

+0

Pensa ad altre lingue come R. Hai una funzione trama con, non so,> 20 parametri. Hanno tutti nomi e la maggior parte è facoltativa, solo i dati sono obbligatori. Puoi decidere di dare più parametri per personalizzare il disegno dando una coppia 'nome = valore'. Questo non produce disordine ed è IMO abbastanza carino. Quindi, la domanda ha almeno un punto. – agoldev

+0

Python supporta anche questo. –

risposta

10

Assolutamente no.

Un modo si sarebbe in grado di passare in argomenti non ordinate è quello di prendere in un array associativo:

function F($params) { 
    if(!is_array($params)) return false; 
    //do something with $params['A'], etc... 
} 

È quindi possibile richiamare in questo modo:

F(array('C' => 3, 'A' => 1, 'B' => 1)); 
+2

+1 mi ha battuto. – Gordon

+0

"L'unico modo" -> non proprio corretto :) – marcog

+0

puoi dire perché no? –

0

No, non usando la sintassi standrad php.

Ci sono sempre trucchi per quello, naturalmente, come se si definisce la funzione da soli, si potrebbe fare qualcosa di simile

F(array('C'=>3, 'A'=>1, 'B'=>1)); 

Ma per questo si dovrà riscrivere la funzione originale, naturalmente, in modo che accetterebbe un array come argomenti, invece di accettare solo gli argomenti stessi.

1

No, ma è potrebbe passare in un array associativo gestire questo:

f(array('C'=>3, 'A'=>1, 'B'=>1)); 

e poi accedervi da:

function f($obj) 
{ 
    $c = $obj['C']; 
} 
+0

puoi dire perché no? –

0

No, non è possibile. Qualcosa che ho fatto per funzioni in cui molti parametri sono opzionali o che non voglio che l'ordine abbia importanza è invece di utilizzare un singolo parametro di array.

function myfunc($options) { 
    $one = $options['one']; 
    $two = $options['two']; 
    // etc. 
} 
0

Tratto da here ...

Se si preferisce utilizzare argomenti con nome alle funzioni (in modo da non dovete preoccuparvi di l'ordine degli elenchi di argomenti variabili), è possibile farlo PERL stile con gli array anonimi:

<?php 
function foo($args) 
{ 
    print "named_arg1 : " . $args["named_arg1"] . "\n"; 
    print "named_arg2 : " . $args["named_arg2"] . "\n"; 
} 

foo(array("named_arg1" => "arg1_value", "named_arg2" => "arg2_value")); 
?> 

uscita volontà:

named_arg1 : arg1_value 
named_arg2 : arg2_value 
2

PHP fa Non ho argomenti con nome, quindi la risposta breve è no. Ci sono due soluzioni che riesco a trovare, anche se non sono così fantastiche.

Si potrebbe definire la funzione di prendere i suoi argomenti come un array, come this:

function image($img) { 
    $tag = '<img src="' . $img['src'] . '" '; 
    $tag .= 'alt="' . ($img['alt'] ? $img['alt'] : '') .'">'; 
    return $tag; 
} 

$image = image(array('src' => 'cow.png', 'alt' => 'cows say moo')); 
$image = image(array('src' => 'pig.jpeg')); 

Questo metodo richiede, purtroppo, che si modifica la funzione, e di conseguenza non mi piace.L'altra opzione è quella di utilizzare this wrapper class che consente di utilizzare argomenti con nome in uno dei seguenti modi:

$obj->method(array('key' => 'value', 'key2' => 'value2')); 
$obj->method(':key = value', ':key2 = value2'); 
Problemi correlati