2011-03-11 13 views
18

Ho appena scoperto che esiste una funzione denominata func_get_arg in PHP che consente allo sviluppatore di utilizzare uno stile diverso per ottenere argomenti. Sembra molto utile perché il numero di argomenti può essere arbitrario, ma non riesco a pensare a un buon esempio di utilizzo.Qual è il buon esempio dell'uso di "func_get_arg" in PHP?

Quali sono alcuni esempi dell'utilizzo di questa funzione per avvantaggiarsi pienamente delle sue caratteristiche polimorfiche?

+0

http://us2.php.net/manual/en/function.func-get-arg.php Scorri fino a 'Esempi', quindi leggi' Note relative all'utente ' – drudge

+0

'sprintf' e' max' sono buone esempi di funzioni che possono gestire un numero arbitrario di argomenti. Di solito lo si vuole usare con parametri tipizzati in modo uniforme. – mario

+4

Non intendi "polimorfo": il termine che stai cercando è "variadic": http://en.wikipedia.org/wiki/Variadic_function –

risposta

22

Io di solito uso func_get_args() che è più facile da usare se si desidera più argomenti.

Ad esempio, per ricreare il max() di PHP.

function max() { 
    $max = -PHP_INT_MAX; 
    foreach(func_get_args() as $arg) { 
     if ($arg > $max) { 
      $max = $arg; 
     } 
    } 
    return $max; 
} 

CodePad.

Ora è possibile eseguire echo max(1,5,7,3) e ottenere 7.

+4

Sai, puoi ridurre, se perdonerai il gioco di parole , fino a 'array_reduce (func_get_args(), 'max')', e funzionerà anche con numeri negativi. –

+0

@Keith Forse avrei dovuto fare quel numero iniziale '-PHP_INT_MAX'. – alex

+1

L'unico problema è che se non viene fornito alcun argomento, la risposta è '-PHP_INT_MAX'. 'array_reduce ($ a, 'max')' funzionerà anche per un array vuoto, nel qual caso restituirà 'null'. Qui stiamo ottenendo un piccolo argomento.:-) –

1

Non uso quasi mai func_get_arg(), ma io uso suo cugino func_get_args() un bel po '. Ecco un esempio, una funzione lungo le linee della dichiarazione echo quell'entità codifica tutti i suoi argomenti:

function ee() { 
    $args = func_get_args(); 
    echo implode('', array_map('htmlentities', $args)); 
} 

io uso quella funzione un po '.

Ecco un altro esempio utile, una funzione che svolge lo stesso lavoro della funzione COALESCE() di SQL.

function coalesce() { 
    $args = func_get_args(); 
    foreach ($args as $arg) { 
     if (!is_null($arg)) { 
      return $arg; 
     } 
    } 
    return null; 
} 

Restituisce il primo argomento non nullo passata in, o null se non c'è tale argomento.

+2

[È possibile rimuovere il primo argomento] (http://codepad.org/Gil0Xi29) in 'implode()'. – alex

+3

Forza dell'abitudine - Ho scritto codice in PHP da poco dopo che è apparso PHP 4.0. –

1

Personalmente, non penso che ci sia un buon caso di utilizzo all'interno di una normale funzione. Come maniaco del controllo mi piace sapere esattamente cosa viene passato alle mie funzioni e mi piace sapere esattamente cosa sto passando.

Tuttavia, può essere utilizzato completamente per routing URL dinamico/statico. Quando stai riscrivendo (tramite mod_rewrite) l'URL fa riferimento a un singolo bootstrap.

In questo senso, è possibile avere argomenti che non devono necessariamente esistere con ogni richiesta di pagina.

2

Prima di tutto, si sta usando il termine "polimorfismo" completamente sbagliato. Il polimorfismo è un concetto nella programmazione orientata agli oggetti e non ha nulla a che fare con il numero variabile di argomenti nelle funzioni.

Nella mia esperienza, tutto lo func_get_args consente di aggiungere un po 'di zucchero sintattico.

Pensa a una funzione che può richiedere un numero qualsiasi di numeri interi e restituire la loro somma. (Sto imbrogliando, poiché questo esiste già in array_sum. Ma l'inganno è buono se mantiene semplice l'esempio). Si potrebbe fare in questo modo:

// you can leave "array" out; I have it because we should be getting one here 
function sum1(array $integers) { 
    return array_sum($integers); 
} 

Ora si potrebbe chiamare questo modo:

$sum = sum1(array(1)); 
$sum = sum1(array(1, 2, 3, 4)); 

Questo non è molto carina.Ma possiamo fare meglio:

function sum2() { 
    $integers = func_get_args(); 
    return array_sum($integers); 
} 

Ora si può chiamare in questo modo:

$sum = sum2(1); 
$sum = sum2(1, 2, 3, 4); 
2

Diciamo che abbiamo più array contenenti dati in cui abbiamo bisogno di cercare attraverso le chiavi per i loro valori senza fusione questi array.

Gli array sono come:

$a = array('a' => 5, 'b' => 6); 
$b = array('a' => 2, 'b' => 8); 
$c = array('a' => 7, 'b' => 3); 

In questo caso, diciamo abbiamo bisogno di ottenere tutti i valori della chiave a da tutte le matrici. Possiamo scrivere una funzione che prende in numero arbitrario di matrici per la ricerca in

// we need the key, and at least 1 array to search in 
function simpleSearchArrays($key, $a1){ 
    $arrays = func_get_args(); 
    array_shift($arrays); // remove the first argument, which is the key 
    $ret = array(); 
    foreach($arrays as $a){ 
     if(array_key_exists($key, $a)){ 
      $ret[] = $a[$key]; 
     } 
    } 
    return $ret; 
} 

Quindi, se si usa la funzione:.

$x = simpleSearchArrays('a', $a, $b, $c); 

$x conterrà quindi array(5, 2, 7).

0

Leggere il documento ufficiale e ha rilevato che func_get_args():
Ottiene una matrice dell'elenco di argomenti della funzione.

Questa funzione può essere utilizzata in combinazione con func_get_arg() e func_num_args() per consentire alle funzioni definite dall'utente di accettare elenchi di argomenti di lunghezza variabile.

<?php 
     function foo() 
     { 
      $numargs = func_num_args(); 
      echo "Number of arguments: $numargs \n"; 
      if ($numargs >= 2) { 
       echo "Second argument is: " . func_get_arg(1) . "\n"; 
      } 
      $arg_list = func_get_args(); 
      for ($i = 0; $i < $numargs; $i++) { 
       echo "Argument $i is: " . $arg_list[$i] . "\n"; 
      } 
     } 

     foo(1, 2, 3); 
?> 
0

A partire dal php5.6, non c'è un caso d'uso di func_get_arg più; che non vuol dire che la sua funzionalità non è più necessaria, ma è sostituito dal variadic function utilizzando la ... sintassi:

/** 
* @param array $arguments 
*/ 
public function poit(...$arguments) 
{ 
    foreach($arguments as $argument) { 
     ... 
    } 
} 

Ciò è particolarmente utile se ci sono metodi che sono sovraccarichi alla fine; uno ha bisogno di filtrare i primi argomenti più, come presentato dal an example:

vecchio stile utilizzando func_get_arg:

function foo($a, $b) { 
    $c = array(); 
    if (func_num_args() > 2) { 
     for($i = 0; $i < func_num_args()-2; $i++) { 
      $c[] = func_get_arg($i+2); 
     } 
    } 
    var_dump($a, $b, $c) 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

recente stile variadic;

function foo($a, $b, …$c) { 
    var_dump($a, $b, $c); 
    // Do something 
} 
foo('a', 'b', 'c', 'd'); 

Entrambi producono lo stesso output, uno è molto più semplice da scrivere.

Problemi correlati