Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #20844 > unrolled thread
| Started by | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| First post | 2016-05-25 13:49 +0200 |
| Last post | 2016-05-26 12:12 +0200 |
| Articles | 14 — 3 participants |
Back to article view | Back to it.comp.www.php
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
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-05-25 13:49 +0200 |
| Subject | passare 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]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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]
| From | fmassei@gmail.com |
|---|---|
| Date | 2016-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]
| From | alex <1j9448a02@lnx159sneakemail.com.invalid> |
|---|---|
| Date | 2016-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