2013-08-12 9 views
7

mi è familiare con la creazione di una funzione PHP posizionato nella parte superiore del file .php come ad esempio:Come funzionano 'function' e 'use' e 'array_filter' in PHP?

function my_little_function($parm1,$parm2) { 
    if ($parms < $parm2) { 
    return "yes"; 
    } else { 
    return "no"; 
    } 
} 

Poi chiamare in questo modo:

$result = my_little_function("1","2"); 
echo "The answer is $result." . "\n"; 

ho qualche codice, I didn' Scrivilo, che usa "function" e "use" insieme all'interno di un uso tradizionale di una funzione come my_little_function sopra.

Sono confuso da questo e ho alcune domande per gli sviluppatori PHP più esperti. Ecco parte del codice PHP di lavoro a cui mi riferisco:

$neededObject = array_filter($st_ny_trip->STOPS->STOP,function($e) use ($final_desired_dest,$connect_raw){return $e->NAME == $final_desired_dest && DateTime::createFromFormat("m/d/Y g:i:s a", $e->TIME) > $connect_raw;}); 

$e non è impostato in qualsiasi parte della funzione o il resto del programma, così che cosa sta usando $e? Come viene passato un valore e come viene utilizzato? Non sembra esserci alcun nome per questa funzione, quindi non so come viene chiamato, come viene fatto?

È questa creazione di una funzione da utilizzare al volo e viene generata nuovamente ogni volta che viene chiamato questo codice? Se si tratta di una funzione, perché non crearla al di fuori di questa funzione e chiamarla?

Anche io non ho ancora usato "uso", quindi non mi è familiare. Ho cercato su php.net e sembra proprio un modo per assegnare un valore a qualcosa, ma non sono riuscito a trovare alcun esempio pratico per dimostrare perché è necessario e quando dovrebbe essere usato.

Ho cercato su array_filter e dice che è "Filtra gli elementi di un array usando una funzione di callback". Non so cosa sia una funzione di richiamata. Si riferisce a function($e)?

La riga del codice PHP sopra per $neededObject deve essere formattata in modo diverso in modo che sia più facile da leggere?

+1

http: //php.net/manual/en/functions.anonymous.php – NDM

+0

PHP è così fantastico, ha un diverso argomento ordine nt per 'array_map()' e 'array_filter()'. PHP ti dirà se stai sbagliando, ma ancora. Strano. – Rudie

risposta

6

Usiamo array_map() per spiegare cosa sta succedendo.

Vogliamo duplicare l'input di un array: quindi se l'input è aa, l'output sarà aaaa.

Quindi il modo normale, sarebbe quello di creare una funzione e poi passarlo al array_map():

$array = range('a', 'e'); 

$new_array = array_map('duplicate', $array); 
print_r($new_array); 

function duplicate($string){ 
    return $string.$string; 
} 

Online demo

Ma cosa succede se si desidera utilizzare questa funzione solo una volta? Dal momento che PHP 5.3, c'è una cosa chiamata anonymous functions, lo usiamo come il seguente:

$array = range('a', 'e'); 

$new_array = array_map(function($string){ 
    return $string.$string; 
}, $array); 
print_r($new_array); 

Online demo

Ora, diciamo per esempio si desidera aggiungere un valore standard da un'altra variabile. È facile con le variabili globali. Ma come sappiamo, le variabili globali sono malvagie e dovrebbero essere evitate. Possiamo utilizzare use():

$array = range('a', 'e'); 
$standard_value = ','; 

$new_array = array_map(function($string)use($standard_value){ 
     // $standard_value becomes available inside the function 
    return $string.$standard_value.$string; 
}, $array); 
print_r($new_array); 

Online demo

use() può essere anche diventare utile se si usa un riferimento di scrivere una variabile esterna mentre loop:

$array = range('a', 'e'); 
$another_string = ''; 

$new_array = array_map(function($string)use(&$another_string){// note & 
    $another_string .= $string.$string; // overwrite $another_string 
    return $string.$string; 
}, $array); 
print_r($new_array); 
echo PHP_EOL . $another_string; 

Online demo

2

le $e agisce variabile come un parametro di funzione normale, e avrà quindi essere passato dal codice chiamando la funzione, vedere la documentazione per il valore di $e utilizzando array_filter.

L'istruzione use importa le variabili dall'ambito locale nello scope anonymous' function.

$myvar = 'world'; 
$myFunc = function ($test) use ($myvar) { 
    return $test . ' ' . $myvar; 
}; 
echo $myFunc('hello'); // echoes 'hello world'; 

Se non si include la parte use ($myvar), quindi isset($myvar) sarebbe return false da all'interno la funzione anonima, dal momento che ha un campo di applicazione separata.