2009-10-09 7 views
6

Voglio chiamare una funzione con call_user_func_array ma ho notato che se un argomento è un riferimento nella definizione della funzione ed è un valore semplice in call_user_func_array, viene visualizzato il seguente avviso: Avviso: il parametro 1 da test() dovrebbe essere un di riferimento, il valore datoPHP Come sapere se una variabile è un riferimento?

Ecco un semplice esempio di quello che sto cercando di fare:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

la mia domanda è: come posso sapere se un valore (in questo caso il primo valore di $ args) è un riferimento o no?

risposta

2

Scopri i commenti di questa pagina documentazione di PHP:

http://php.net/manual/en/language.references.spot.php

+1

vedo solo le funzioni per controllare se due matrici/oggetti/variabili puntano alla stessa area di memoria modificando uno e controllando se anche l'altro viene modificato. Nel mio codice (non nell'esempio, quello reale), ho solo la matrice di argomenti e voglio sapere se un argomento è un riferimento. In questo modo, posso lanciare un errore se la funzione di callback vuole un riferimento e la matrice contiene un valore semplice. –

+0

Attivano già un avviso, destinato agli sviluppatori. Che tipo di errore vuoi? È possibile [impostare un gestore errori personalizzato] (http://php.net/set_error_handler) se si desidera modificare il comportamento – cmbuckley

4

No, il problema è che il primo parametro della funzione è pass-by-di riferimento (cioè la funzione può modificare l'argomento in ambito del chiamante). Pertanto, è necessario passare una variabile o qualcosa che è assegnabile come primo argomento. Quando si crea la matrice come array($a), copia semplicemente il valore della variabile $a (che è 0) in uno slot dell'array. Non fa riferimento alla variabile $a in alcun modo. E poi, quando si chiama la funzione, è come se si sta facendo questo, che non funziona:

test(0) 

Se si voleva davvero, si potrebbe mettere $a nella matrice per riferimento, ma è un po 'complicato :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

Per quanto riguarda il modo in cui si direbbe che l'elemento dell'array è un riferimento ... difficile. Si potrebbe fare var_dump() sulla matrice, e cercare il "&" simbolo:

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

Sì, so che il codice funziona in questo modo. Volevo solo un modo per assicurarmi che l'array $ args (che può contenere qualsiasi cosa, poiché nel mio codice è passato da un'altra funzione) è stato creato in questo modo per evitare qualsiasi errore quando chiamo call_user_func_array. Ecco perché volevo sapere come verificare se le variabili nell'array erano o meno riferimenti. –