2013-10-01 17 views
5

È possibile che in php come in python siano specificati parametri di funzione? Un caso di esempio utilizzo è:Parametri funzione denominati in PHP

function foo($username = "", $password = "", $timeout = 10) { 

} 

voglio ignorare $timeout:

foo("", "", 3); 

Ugly. Avrei preferito fare:

foo(timeout=3); 
+0

La risposta è no, anche se credo che al momento sia in discussione una [RFC] (https://wiki.php.net/rfc/named_params), ma è improbabile che vada oltre la fase di discussione ... . Credo che Facebook [hh] (https://t.co/I0RUiMMEsb) lo implementa anche se lo –

+0

l'ho fatto, non funziona. – Justin

+0

Scusa, ho frainteso quello che stavi chiedendo. –

risposta

4

No, parametri denominati non sono possibili in PHP. Tecnicamente quando chiami foo($timeout=3) sta valutando prima $timeout=3, con un risultato di 3 e passando come primo parametro a foo(). E PHP impone l'ordine dei parametri, quindi la chiamata comparabile dovrebbe essere foo("", "", $timeout=3). Avete altre due opzioni:

  • Fare in modo che la propria funzione assuma un array come parametro e controllare i tasti dell'array. Personalmente trovo questo brutto ma funziona ed è leggibile. Upside è semplice ed è facile aggiungere nuovi parametri in seguito. Il rovescio della medaglia è che la tua funzione è meno autodocumentante e non avrai molto aiuto dagli IDE (completamento automatico, ricerche paramatiche rapide, ecc.).
  • Impostare la funzione senza parametri e chiedere a PHP gli argomenti utilizzando func_get_args() oppure utilizzare lo ...variable length arguments feature in PHP 5.6+. In base al numero di parametri puoi decidere come trattare ciascuno. Molte funzioni di JQuery fanno qualcosa del genere. Questo è facile, ma può essere fonte di confusione per chi chiama le tue funzioni perché non è anche auto-documentante. E i tuoi argomenti non sono ancora nominati.

Nota c'è an RFC for named parameters ancora "in discussione".

+0

Evviva per la tecnica di assegnazione da un'estetica pov. C'è solo un inconveniente, sembra molto simile ai parametri (ehm, questo è il punto no?). Ma questo potrebbe dare l'impressione che l'ordine non abbia più importanza, dove in effetti lo fa. Suppongo che una parte di esso non sia così auto-documentante. Quindi, per correggere la tua risposta, tecnicamente puoi solo fare: 'foo ('', '', $ timeout = 3);' – nus

+0

ps: ci sono altri aspetti negativi minori: le prestazioni (raramente sarà un problema) e potenzialmente la sovrascrittura esistente variabili. Tutto sommato il vantaggio rispetto a 'foo ('', '', 3/* timeout * /);' è discutibile. – nus

0

si dovrebbe usare altri parametri ordinare

foo($timeout=3,$username='',$password='') 

o pensare di utilizzare

func_get_args

+0

Penso che sia una domanda generale che gli sta chiedendo, non in questo caso particolare. – Fluffeh

+0

Il timeout non appartiene prima però, solo un comportamento molto strano, lo standard è username, password. – Justin

+0

quindi se vuoi il tuo ordine originale - di quanto dovrai usare func_get_args - contali e poi li imposti sulle variabili che ti servono, in altri casi - come fa php a sapere che il timeout che stai passando - isn ' t il nome utente? – Axel

0

Vecchia domanda, ma ecco alcune ulteriori informazioni.

Come indicato nelle altre risposte, PHP non supporta direttamente i parametri denominati. VBA è un'altra lingua che ha quel lusso.

In PHP, è possibile utilizzare un sostituto abbastanza ragionevole. manipolazione matrice di PHP è particolarmente buono, ed è possibile utilizzare un array associativo per passare una matrice di parametri, come segue:

function foo($parms=array()) { 
    $username = parms['username']?:'…'; 
    $password = parms['password']?:'…'; 
    $timeout = parms['timeout']?:'…'; 
} 

foo(array('timeout'=>10)); 

Nota l'uso dell'operatore ?: per consentire un semplice predefinito se l'elemento di matrice di ingresso doesn' Esistono

Non altrettanto chiari, ma i parametri denominati hanno un altro ruolo importante: consentono di lavorare con un numero elevato di opzioni senza un elenco troppo lungo di parametri ordinati.

Un modo alternativo di scrivere la funzione è quella di utilizzare la funzione di `estratto:

function foo($parms=array()) { 
    $username = '…'; 
    $password = '…'; 
    $timeout = '…'; 
    extract($parms,EXTR_IF_EXISTS); 
} 

Qui i extract funzione copia i valori nelle variabili, ma solo se sono già stati definiti. Ciò impedisce l'importazione di variabili che non conoscevi.

Problemi correlati