Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #20844 > unrolled thread

passare un riferimento ad una callback

Started byalex <1j9448a02@lnx159sneakemail.com.invalid>
First post2016-05-25 13:49 +0200
Last post2016-05-26 12:12 +0200
Articles 14 — 3 participants

Back to article view | Back to it.comp.www.php


Contents

  passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 13:49 +0200
    Re: passare un riferimento ad una callback Alessandro Pellizzari <shuriken@amiran.it> - 2016-05-25 13:27 +0100
      Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 14:58 +0200
        Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 15:25 +0200
          Re: passare un riferimento ad una callback fmassei@gmail.com - 2016-05-25 06:43 -0700
            Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 16:21 +0200
              Re: passare un riferimento ad una callback fmassei@gmail.com - 2016-05-25 07:33 -0700
                Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 17:57 +0200
    Re: passare un riferimento ad una callback fmassei@gmail.com - 2016-05-25 06:41 -0700
      Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 16:31 +0200
        Re: passare un riferimento ad una callback fmassei@gmail.com - 2016-05-25 07:34 -0700
          Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-25 18:01 +0200
            Re: passare un riferimento ad una callback fmassei@gmail.com - 2016-05-25 09:22 -0700
              Re: passare un riferimento ad una callback alex <1j9448a02@lnx159sneakemail.com.invalid> - 2016-05-26 12:12 +0200

#20844 — passare un riferimento ad una callback

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 13:49 +0200
Subjectpassare un riferimento ad una callback
Message-ID<ni43fg$v0n$1@gioia.aioe.org>
$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è?

[toc] | [next] | [standalone]


#20845

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2016-05-25 13:27 +0100
Message-ID<dqlk1dFkkmU1@mid.individual.net>
In reply to#20844
On 25/05/2016 12:49, alex wrote:

> $arr = array();

> call_user_func(
>     function (array &$ref) {},
>     $arr
> );//errore

> 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.

[toc] | [prev] | [next] | [standalone]


#20846

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 14:58 +0200
Message-ID<ni47go$157t$1@gioia.aioe.org>
In reply to#20845
Il 25/05/2016 14:27, Alessandro Pellizzari ha scritto:
> 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?)?

[toc] | [prev] | [next] | [standalone]


#20847

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 15:25 +0200
Message-ID<ni494s$17la$1@gioia.aioe.org>
In reply to#20846
Il 25/05/2016 14:58, alex ha scritto:
> Il 25/05/2016 14:27, Alessandro Pellizzari ha scritto:
>> 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.

[toc] | [prev] | [next] | [standalone]


#20852

Fromfmassei@gmail.com
Date2016-05-25 06:43 -0700
Message-ID<308a214f-eb83-473a-ac1f-f894a07eae06@googlegroups.com>
In reply to#20847
On Wednesday, May 25, 2016 at 9:25:51 AM UTC-4, alex wrote:
> Il 25/05/2016 14:58, alex ha scritto:
> > Il 25/05/2016 14:27, Alessandro Pellizzari ha scritto:
> >> 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.
> 

???
No, ci sono delle regole precise di cosa passa per riferimento, cosa per
valore, e quando e come sono fatte le copie.
Non è una roba che decide l'interprete a capocchia..

> Tralasciando cmq questa breve prefazione, sarei curioso di capire perchè 
> 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!

[toc] | [prev] | [next] | [standalone]


#20854

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 16:21 +0200
Message-ID<ni4ccp$1d8r$1@gioia.aioe.org>
In reply to#20852
Il 25/05/2016 15:43, fmassei@gmail.com ha scritto:
>> >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.
>> >
> ???
> No, ci sono delle regole precise di cosa passa per riferimento, cosa per
> valore, e quando e come sono fatte le copie.

????

> Non è una roba che decide l'interprete a capocchia..
>

E chi sennò?
$param: l'interprete decide di prendere solo il valore, creandone 
appunto una copia da usare solo all'interno della funzione.
&$param: l'interprete decide di prendere il riferimento (viene mantenuto 
il legame/puntamento con la variabile originale).

>> >Tralasciando cmq questa breve prefazione, sarei curioso di capire perchè
>> >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.

Si, in effetti è così.

[toc] | [prev] | [next] | [standalone]


#20857

Fromfmassei@gmail.com
Date2016-05-25 07:33 -0700
Message-ID<a4795eab-9551-4bb3-a6cf-062340a7f262@googlegroups.com>
In reply to#20854
On Wednesday, May 25, 2016 at 10:21:19 AM UTC-4, alex wrote:
> Il 25/05/2016 15:43, fmassei@gmail.com ha scritto:
> >> >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.
> >> >
> > ???
> > No, ci sono delle regole precise di cosa passa per riferimento, cosa per
> > valore, e quando e come sono fatte le copie.
> 
> ????
> 

Leggi sotto.

> > Non è una roba che decide l'interprete a capocchia..
> >
> 
> E chi sennò?
> $param: l'interprete decide di prendere solo il valore, creandone 
> appunto una copia da usare solo all'interno della funzione.
> &$param: l'interprete decide di prendere il riferimento (viene mantenuto 
> il legame/puntamento con la variabile originale).
> 

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.

[toc] | [prev] | [next] | [standalone]


#20859

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 17:57 +0200
Message-ID<ni4i13$1mg1$1@gioia.aioe.org>
In reply to#20857
Il 25/05/2016 16:33, fmassei@gmail.com ha scritto:
> 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.

E si comporta di conseguenza (fa quello che deve fare).

> P.S. Internamente poi non è quello che succede, per motivi d'ottimizzazione,
> ma questo non c'interessa più di tanto.

Certo.

[toc] | [prev] | [next] | [standalone]


#20851

Fromfmassei@gmail.com
Date2016-05-25 06:41 -0700
Message-ID<21055dda-0d1b-40cf-8045-63b9efddcdf7@googlegroups.com>
In reply to#20844
On Wednesday, May 25, 2016 at 7:49:07 AM UTC-4, alex wrote:
> $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é devi passare il puntatore, non il valore.

call_user_func_array(function (array &$ref) {}, array(&$arr));

Ciao!

[toc] | [prev] | [next] | [standalone]


#20856

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 16:31 +0200
Message-ID<ni4cvi$1e3i$2@gioia.aioe.org>
In reply to#20851
Il 25/05/2016 15:41, fmassei@gmail.com ha scritto:
> Perché devi passare il puntatore, non il valore.
>
> call_user_func_array(function (array &$ref) {}, array(&$arr));
>
> Ciao!
>

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

[toc] | [prev] | [next] | [standalone]


#20858

Fromfmassei@gmail.com
Date2016-05-25 07:34 -0700
Message-ID<903f0fdc-02d5-41db-9fb1-b18dc27096ff@googlegroups.com>
In reply to#20856
On Wednesday, May 25, 2016 at 10:31:16 AM UTC-4, alex wrote:
> Il 25/05/2016 15:41, fmassei@gmail.com ha scritto:
> > Perché devi passare il puntatore, non il valore.
> >
> > call_user_func_array(function (array &$ref) {}, array(&$arr));
> >
> > Ciao!
> >
> 
> è così ho creato un array multidimensionale; meglio di no

Quale sarebbe l'array multidimensionale? :)

Ciao!

[toc] | [prev] | [next] | [standalone]


#20860

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-25 18:01 +0200
Message-ID<ni4i81$1mqk$1@gioia.aioe.org>
In reply to#20858
Il 25/05/2016 16:34, fmassei@gmail.com ha scritto:
> On Wednesday, May 25, 2016 at 10:31:16 AM UTC-4, alex wrote:
>> Il 25/05/2016 15:41, fmassei@gmail.com ha scritto:
>>> Perché devi passare il puntatore, non il valore.
>>>
>>> call_user_func_array(function (array &$ref) {}, array(&$arr));
>>>
>>> Ciao!
>>>
>>
>> è così ho creato un array multidimensionale; meglio di no
>
> Quale sarebbe l'array multidimensionale? :)
>
> Ciao!
>

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

[toc] | [prev] | [next] | [standalone]


#20861

Fromfmassei@gmail.com
Date2016-05-25 09:22 -0700
Message-ID<be1d2a6f-ceb5-4cf7-a7c1-e9067ff70d62@googlegroups.com>
In reply to#20860
On Wednesday, May 25, 2016 at 12:01:11 PM UTC-4, alex wrote:
> Il 25/05/2016 16:34, fmassei@gmail.com ha scritto:
> > On Wednesday, May 25, 2016 at 10:31:16 AM UTC-4, alex wrote:
> >> Il 25/05/2016 15:41, fmassei@gmail.com ha scritto:
> >>> Perché devi passare il puntatore, non il valore.
> >>>
> >>> call_user_func_array(function (array &$ref) {}, array(&$arr));
> >>>
> >>> Ciao!
> >>>
> >>
> >> è così ho creato un array multidimensionale; meglio di no
> >
> > Quale sarebbe l'array multidimensionale? :)
> >
> > Ciao!
> >
> 
> 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!

[toc] | [prev] | [next] | [standalone]


#20864

Fromalex <1j9448a02@lnx159sneakemail.com.invalid>
Date2016-05-26 12:12 +0200
Message-ID<ni6i6e$d6l$1@gioia.aioe.org>
In reply to#20861
Il 25/05/2016 18:22, fmassei@gmail.com ha scritto:
> $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 */

giusta precisazione; cmq la soluzione dell'array nidificato (possiamo 
chiamarlo così?) non mi garba più di tanto: aggiunge ulteriore complessità.

[toc] | [prev] | [standalone]


Back to top | Article view | it.comp.www.php


csiph-web