Newsgroup: it.comp.www.php
Titolo: passare un riferimento ad una callback

$arr = array();
 
function test(array &$ref) {}
 
 
 
call_user_func(
 
     function (array &$ref) {},
 
     $arr
 
);//errore
 
 
 
test($arr);//tutto ok
 
 
Proviamo....
 
PHP Warning:  Parameter 1 to {closure}() expected to be a reference
 
Perchè?

 Perchè?
 
Presumo sia perchè lo passi per valore a call_user_func, che poi tenta 
di passarlo alla closure, che se lo aspetta per riferimento.
 
Bye.
 

 Presumo sia perchè lo passi per valore a call_user_func,
 
Mi pare strano... quindi mi stai dicendo che c'è un modo per passarlo 
per valore, e un modo per passarlo per riferimento (quale?)?
 


Infatti è l'interprete php che decide in autonomia di estrarre il valore 
o il riferimento di un parametro, in base a come quest'ultimo è stato 
dichiarato ($par o &$par); in questi casi purtroppo si tende ad usare 
una terminologia poco corretta.
 
Tralasciando cmq questa breve prefazione, sarei curioso di capire perchè 
call_user_func fa il pasticcione.


Perché devi passare il puntatore, non il valore.
 
call_user_func_array(function (array &$ref) {}, array(&$arr));
 
Ciao!

 call_user_func fa il pasticcione.
 
Non "fa il pasticcione": è una funzione che prende il secondo parametro per
valore, e chiama il primo come funzione passandolo, di nuovo, per valore.
E' questo quello che fa.
 
Ciao!

 E' questo quello che fa.
 
Si, in effetti è così.


 
è così ho creato un array multidimensionale; meglio di no
 

 
 
No.
 
Gli argomenti di una funzione sono sempre passati per valore, con l'eccezione
di oggetti, che sono sempre passati per riferimento, e della sintassi con il
&, che forza il passaggio per riferimento.
L'interprete non decide nulla, segue sempre la regola sopra.
 
Ciao!
 
 
P.S. Internamente poi non è quello che succede, per motivi d'ottimizzazione,
ma questo non c'interessa più di tanto.


Quale sarebbe l'array multidimensionale? :)
 
Ciao!

 ma questo non c'interessa più di tanto.
 
Certo.


http://webcheatsheet.com/php/multidimensional_arrays.php
 
http://www.w3schools.com/php/php_arrays_multi.asp
 
http://www.tutorialspoint.com/php/php_arrays.htm
 


Eh, mi sa che invece di postarli qui te li devi leggere, perché ancora stai
facendo confusione..
 
Ti faccio due esempi, che mi sa che con la teoria non ci vai molto d'accordo :)
 
$ap = array(1);
$a = array($ap);
/* $a è un array multidimensionale, infatti rispetta la semantica degli a.m.,
ad esempio la copia (on write) su assegnamento */
$b = $a;
$b[0][0] = 2;
echo "a[0][0] = {$a[0][0]}\n";   /* stampa 1 */
echo "b[0][0] = {$b[0][0]}\n";   /* stampa 2 */
 
Invece, come nel nostro caso:
 
$ap = array(1);
$a = array(&$ap);
/* $a *non* è un array multidimensionale, è un array che contiene un
riferimento ad un altro array. Non rispetta la semantica degli a.m., per
esempio, se fai la stessa cosa di sopra.. */
$b = $a;
$b[0][0] = 2;
echo "a[0][0] = {$a[0][0]}\n";   /* stampa 2 */
echo "b[0][0] = {$b[0][0]}\n";   /* stampa 2 */
 
Ciao!

 echo "b[0][0] = {$b[0][0]}\n";   /* stampa 2 */
 
giusta precisazione; cmq la soluzione dell'array nidificato (possiamo 
chiamarlo così?) non mi garba più di tanto: aggiunge ulteriore complessità.