2016-05-20 12 views
7

Ho la seguente funzione che crea un'istanza di un oggetto ed esegue il suo metodo. Voglio restituire $to_return ma il problema è che $to_return non cambia anche se la funzione utilizza la parola chiave 'uso'. Ecco la funzione:Attendere callback php sull'istanza dell'oggetto e restituire valore sulla funzione

function some_function($arg){ 

    $to_return = false; 

    $object = new Object; 

    $to_return = $object->METHOD(function($callback) use ($to_return){ 

     $to_return = $some_var; 

    }); 

    $to_return = $object->runMETHOD("some_arg"); 

    return $to_return; 

} 

Quindi, in sostanza:

  • $to_return restituito è sempre falso
  • voglio some_function per tornare $ some_var

In breve: come posso fare some_function restituisce l'oggetto modificato all'interno del metodo dell'oggetto?

+0

Basta restituire $ questo nel metodo – peter

+0

@PeterChaula scusa, come esattamente? Potresti essere specifico di questa situazione per favore? Voglio che la funzione restituisca '$ some_var', non un'istanza di un oggetto. – Fane

+0

per aggiornare la proprietà '$ to_return' all'interno della chiusura, quindi dovrai passarlo per riferimento. cioè la funzione (...) usa (& $ to_return) {... '. –

risposta

3

Tutto quello che manca è che indica che $to_return dovrebbero essere passati per riferimento:

function($callback) use (& $to_return) 

anche esempio di esempio lavorare su 3v4l: https://3v4l.org/Vfp70

Non sono un esperto di interni, ma per farla breve primitive sono "copiato" quando li si passa da qualche parte, quindi ciò che si stava impostando nella richiamata non viene trasferito all'esterno. Gli oggetti, d'altro canto, si comporterebbero come ci si aspettava perché il puntatore all'oggetto viene passato e l'istanza originale viene modificata. Utilizzando anche pianura stdClass come tale trasportatore funzionerebbe, come illustrato in questa 3v4l: https://3v4l.org/m9jJ3

+0

No, questo non funziona ... La differenza potrebbe essere che lo stai facendo come una funzione e lo sto facendo come metodo di un oggetto? – Fane

+0

No, dovrebbe funzionare ancora: https://3v4l.org/mD5YD Nel tuo codice stai sovrascrivendo '$ to_return' in almeno 2 posizioni in modo che questo influenzi il suo valore alla fine – malarzm

0

Utilizza la data soluzione @malarzm MA poi anche non assegnare la funzione di un $ to_return (non ha risultato comunque)

Così, invece di

$to_return = $object->METHOD(function($callback) use ($to_return) 

uso:

$object->METHOD(function($callback) use (&$to_return) 

Inoltre si sta sovrascrivendo la stessa variabile befor E anche usando qui:

$to_return = $object->runMETHOD("some_arg"); 

Quindi probabilmente si desidera assegnare il valore di ritorno di tale metodo a una variabile diversa.

Problemi correlati