2016-05-20 9 views
7

Mam następującą funkcję, która tworzy instancję obiektu i uruchamia jego metodę. Chcę zwrócić $to_return, ale problem polega na tym, że $to_return nie zmienia się, nawet jeśli funkcja używa słowa kluczowego "use". Oto funkcja:Czekaj na oddzwanianie php na instancję obiektu i zwracaj wartość na funkcję

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; 

} 

Więc zasadniczo:

  • $to_return zwrócony jest zawsze fałszywe
  • Chcę some_function wrócić $ some_var

W skrócie: w jaki sposób mogę zrobić some_function zwraca obiekt zmieniony wewnątrz metody obiektu?

+0

Po prostu zwróć $ this w metodzie – peter

+0

@PeterChaula przepraszam, jak dokładnie? Czy mógłbyś być konkretny w tej sytuacji? Chcę, aby funkcja zwracała '$ some_var', a nie instancję obiektu. – Fane

+0

, aby zaktualizować właściwość '$ to_return' wewnątrz zamknięcia, należy ją przekazać przez odniesienie. tj. "funkcja (...) użycie (& $ to_return) {...". –

Odpowiedz

3

Wszystko przegapisz wskazuje, że $to_return powinny być przekazywane przez referencję:

function($callback) use (& $to_return) 

również przykład przykładowo pracuje na 3v4l: https://3v4l.org/Vfp70

wewnętrzne nie jestem ekspertem, ale długie opowiadanie prymitywy są "kopiowane", gdy je gdzieś przekazujesz, więc to, co ustawiłeś w wywołaniu zwrotnym, nie zostanie przeniesione na zewnątrz. Z drugiej strony obiekty zachowują się tak, jak się spodziewaliśmy, ponieważ wskaźnik do obiektu jest przekazywany, a oryginalna instancja jest modyfikowana. Korzystanie nawet zwykły stdClass jako taki transporter będzie działać, jak pokazano w tym 3v4l: https://3v4l.org/m9jJ3

+0

Nie, to nie działa ... Czy różnica może być taka, że ​​robisz to jako funkcję i robię to jako metodę obiektową? – Fane

+0

Nie, powinno nadal działać: https://3v4l.org/mD5YD W swoim kodzie nadpisujesz '$ to_return' w co najmniej 2 miejscach, co wpływa na jego wartość na końcu – malarzm

0

Użyj dane rozwiązanie przez @malarzm ale wtedy też nie przypisać funkcję do $ to_return (ma żadnego rezultatu Anyways)

Więc zamiast

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

zastosowanie:

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

również są zastąpieniem tej samej zmiennej befor e nawet używając go tutaj:

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

Prawdopodobnie chcesz przypisać wartość zwracaną tej metody do innej zmiennej.

Powiązane problemy