2012-02-25 4 views
11

Non riesco a trovare nulla di ciò e mi chiedevo se è possibile memorizzare un riferimento di funzione o funzione come valore per un elemento di matrice. Ad es.Funzione come valore di matrice

array("someFunc" => &x(), "anotherFunc" => $this->anotherFunc()) 

Grazie!

+0

Possibile duplicato di [È possibile memorizzare una funzione in un array PHP?] (Http://stackoverflow.com/questions/1499862/can-you-store-a-function-in-a-php-array) – nawfal

+0

'x()' non è una funzione o un riferimento a una funzione ma una chiamata a una funzione; cioè la funzione viene eseguita in questo momento e il valore che restituisce viene memorizzato nell'array al tasto 'someFunc'. Leggi la documentazione di PHP su [funzioni] (http://php.net/manual/en/language.functions.php) per maggiori informazioni (inclusa la risposta alla tua domanda). – axiac

risposta

13

È possibile qualsiasi funzione di "riferimento". Un riferimento alla funzione non è un riferimento nel senso di "indirizzo in memoria" o qualcosa del genere. È semplicemente il nome della funzione.

<?php 

$functions = array(
    'regular' => 'strlen', 
    'class_function' => array('ClassName', 'functionName'), 
    'object_method' => array($object, 'methodName'), 
    'closure' => function($foo) { 
    return $foo; 
    }, 
); 

// while this works 
$functions['regular'](); 
// this doesn't 
$functions['class_function'](); 

// to make this work across the board, you'll need either 
call_user_func($functions['object_method'], $arg1, $arg2, $arg3); 
// or 
call_user_func_array($functions['object_method'], array($arg1, $arg2, $arg3)); 
+0

Ok, grazie! Quindi, alla fine, suppongo di essere alla ricerca di un mezzo per creare un puntatore. Non voglio duplicare una funzione, ma voglio semplicemente un puntatore ad essa in modo tale da poter modificare e leggere il valore a cui fa riferimento il puntatore. – user784446

+0

Accidenti, ho appena realizzato che call_user_func era un membro effettivo della libreria dei metodi delle funzioni di PHP! Grazie! – user784446

+0

Errore di analisi: errore di sintassi, T_FUNCTION inaspettato sulla riga 7 –

5

PHP supporta il concetto di funzioni variabili, in modo da poter fare qualcosa di simile:

function foo() { echo "bar"; } 
$array = array('fun' => 'foo'); 
$array['fun'](); 

Yout può controllare altri esempi in manual.

+1

Grazie, pensavo di farlo come soluzione. Ma i documenti affermano anche che il valore di un elemento può essere di qualsiasi tipo, quindi perché non si possono usare le funzioni? Posso usare "elemento" => oggetto(), ma non so cosa si possa fare con questo. – user784446

5

verifica PHP call_user_func. considera l'esempio di seguito.

Consideriamo due funzioni

function a($param) 
{ 
    return $param; 
} 

function b($param) 
{ 
    return $param; 
} 


$array = array('a' => 'first function param', 'b' => 'second function param'); 

ora se si desidera eseguire tutte le funzioni in una sequenza si può fare con un ciclo.

foreach($array as $functionName => $param) { 
    call_user_func($functioName, $param); 
} 

più array può contenere qualsiasi tipo di dati, sia la funzione di chiamata, gli array nidificati, oggetto, stringa, intero ecc ecc

+0

Voglio solo aggiungere che questo è un buon modo per sostituire una lunga istruzione switch quando non vuoi che i tuoi metodi diventino eccessivamente complessi. –

4

Sì, è possibile:

$array = array(
    'func' => function($var) { return $var * 2; }, 
); 
var_dump($array['func'](2)); 

Ciò, naturalmente, richiede PHP anonymous function supporto, che è arrivato con PHP versione 5.3.0. Questo ti lascerà comunque un codice abbastanza illeggibile.

+0

Che non funziona per me, restituisce un errore T_FUNCTION UNEXPECTED. – user784446

+0

Quale versione di PHP stai usando? Funziona bene sul mio portatile, che esegue PHP 5.3.6. Se stai usando 5.2 allora questo sicuramente non funzionerà come menzionato nella mia risposta sopra. – Treffynnon

+0

Ah, ok. Questo è probabilmente il motivo. Sto usando PHPDesigner2008, quindi è probabile che la libreria di notifica degli errori sia obsoleta. – user784446