Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Passaggio by-reference a funzione senza argomenti

    Ciao, come da titolo, sto cercando di passare una variabile by-reference a una funzione priva di argomenti. Esempio:
    Codice PHP:
    function moltiplica(){
        
    $a *= $b;
    }

    $a 10;
    $b 2;

    moltiplica(&$a,$b);
    print_r($a); 
    Se fosse definita function moltiplica($a,$b) o function moltiplica(&$a,$b) ovviamente la print_r darebbe 20, ma in questo caso dà 10 perché in realtà non usa il riferimento (e non so come usarlo ). Come posso fare una cosa del genere? Sono riuscito a farlo con l'appoggio di una variabile globale, così:
    Codice PHP:
    moltiplica(&$a,$b);
    $a get_reference();
    print_r($a); 
    che mi dà giusto 20, ma vorrei farlo direttamente senza variabili di appoggio è possibile? Avete qualche idea in merito?

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Non capisco come php potrebbe matchare i parametri con le variabili se non li definisci.
    So che si puo' anche definire una funzione senza alcun parametro e quindi ho fatto una prova con func_get_arg ma func_get_ar torna il valore non il riferimento.

    PS: quale versione di php usi ? Ho provato il tuo codice e ho avuto un fatal errore al momento del richiamo della funzione.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Per forza hai avuto un fatal errore, get_reference() non è una funzione built-in, l'ho scritta io

    Aspetta, mi sono reso conto che non sono mi espresso bene nell'esporre il problema, ora lo riscrivo.
    Diciamo che ho 2 funzioni, una priva di argomenti che chiama una seconda con passaggio per riferimento:
    Codice PHP:
    echo "Livello 0<br>\n";
    $a 10;
    $b 2;
    $c chiama_funzione($a$b);
    var_dump($c == $a); // false

    function chiama_funzione(){
        echo 
    "Livello 1<br>\n";
        list(
    $c$d) = func_get_args(); // Lo so che non funziona, ma è per far capire l'intento
        
    $res moltiplica($c$d);
        
    var_dump($res == $c); // true
        
    return $res;
    }

    function 
    moltiplica(&$a$b){
        echo 
    "Livello 2<br>\n";
        
    $a *= $b;
        return 
    $a// La ridondanza è voluta, per verificare la propagazione del valore

    Al "Livello 0" passo alla chiama_funzione() i valori che chiama_funzione() passerà a moltiplica().
    Al "Livello 1" avviene un passaggio per riferimento diretto, quindi la var_dump() darà "true", infatti il problema non è questo.
    Al "Livello 0", la var_dump() darà "false", infatti $c avrà il valore atteso (20), mentre $a avrà ancora il valore iniziale (10) perché la propagazione non è avvenuta.

    Ho usato due soluzioni per ottenere il passaggio per riferimento indiretto, ma hanno un inghippo:
    Codice PHP:
    SOLUZIONE 1:                                         Versione multipla:

    add_reference($a);                                   add_references($a$b);
    chiama_funzione($a$b);                             chiama_funzione($a$b);
    $a get_reference();                                list($a$b) = get_references();

    SOLUZIONE 2// passaggio per riferimento durante la chiamata

    chiama_funzione(&$a$b);                           chiama_funzione(&$a, &$b);
    $a get_reference();                               list($a$b) = get_references(); 
    (Prima di farti venire mal di testa, sappi che add_reference() e get_reference() sono funzioni mie.)

    L'inghippo sta nel fatto che (per come l'ho implementato) devo scrivere ESATTAMENTE LA STESSA COSA in tutte le righe qui sopra. Esempio:
    Codice PHP:
    // questo funziona
    add_reference($a);
    chiama_funzione($a$b);
    $a get_reference();

    // anche questo funziona
    $s 'a';
    add_reference($$s);
    chiama_funzione($$s$b);
    $
    $s get_reference();

    // questo NON funziona, nonostante $a e $$s siano sostanzialmente la stessa variabile
    $s 'a';
    add_reference($$s);
    chiama_funzione($a$b);
    $a get_reference();

    // questo non funziona perché $c non è definita
    add_reference($a);
    chiama_funzione($a$b);
    $c get_reference(); // $c = NULL 
    Sto quindi cercando di fare questa cosa nella maniera più "naturale" possibile Idee?
    Ultima modifica di ZioLuffio; 09-10-2014 a 10:38

  4. #4
    Questo script :
    [PHP]
    function moltiplica(){
    $a *= $b;
    }

    $a = 10;
    $b = 2;

    moltiplica(&$a,$b);
    print_r($a); [PHP]

    Non può funzionare.
    Con php 5.4 o successivi è stata rimossa la chiamata by-reference. Devi definire gli argomenti della funzione come parametri by-reference.

  5. #5
    Quote Originariamente inviata da W Thunderbird Visualizza il messaggio
    Questo script :
    [PHP]
    function moltiplica(){
    $a *= $b;
    }

    $a = 10;
    $b = 2;

    moltiplica(&$a,$b);
    print_r($a); [PHP]

    Non può funzionare.
    Con php 5.4 o successivi è stata rimossa la chiamata by-reference. Devi definire gli argomenti della funzione come parametri by-reference.
    Sì lo so. Leggi il post numero 3, grazie

  6. #6
    Questa volta, più che un voto.. è favoreggiamento.

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    Torna i valori non i riferimenti.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Cosi riesco a fare un passaggio by reference. E' un po' macchinoso ma puo' darti una via di ricerca.
    In sostanza quando si passa una variabile ad una funzione, è il valore che viene passato mente se si passa un oggetto viene passato il suo riferimento.

    Codice PHP:
    <?php
    class pippo {    
        private 
    $x;
        function 
    __construct() {        
          
    $this->0;    
        }
        function 
    set($x) {        
          
    $this->$x;    
        }
        function 
    get() {        
          return 
    $this->x;    
        }
    // class pippo

    function molteplica() {    
       list(
    $aa,$bb) = func_get_args();    
       
    $aa->set($aa->get()*$bb->get());
    }
    $a = new pippo();
    $b = new pippo();
    //
    $a->set(10);
    $b->set(2);
    //
    molteplica($a,$b);
    print 
    $a->get();
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Cosi riesco a fare un passaggio by reference. E' un po' macchinoso ma puo' darti una via di ricerca.
    In sostanza quando si passa una variabile ad una funzione, è il valore che viene passato mente se si passa un oggetto viene passato il suo riferimento.
    Fammi capire, perché con OOP non sono molto ferrato
    Se scrivo moltiplica($a,$b), passo sempre e solo i riferimenti?

  10. #10
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da ZioLuffio Visualizza il messaggio
    Fammi capire, perché con OOP non sono molto ferrato
    Se scrivo moltiplica($a,$b), passo sempre e solo i riferimenti?
    Si perche passi un oggetto e di per se un oggetto non ha alcun valore.
    Poi in molteplica si usano "oggetti" $aa e $bb che non sono stati istanziati (non ci sono i new pippo(); che servono ad istanziare ) quindi siccome funziona significa che $aa e $bb usano un riferimento a $a e $b.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.