2010-09-03 15 views

Odpowiedz

39

call_user_func może tylko parametry przejścia przez wartość, nie przez odniesienie. Jeśli chcesz przejść przez referencję, musisz zadzwonić bezpośrednio do tej funkcji lub użyć call_user_func_array, która akceptuje referencje (jednak może nie działać w PHP 5.3 i później, w zależności od tego, na którą część podręcznika się patrzy).

+0

@Artefakto Zostawiłem to pierwotnie, ponieważ instrukcja mówi, że tak nie jest w 5.3, ale zaktualizowałem swoją odpowiedź. –

+0

Nazwałbym to bezpośrednio, ponieważ właśnie miałem przypadek, w którym skrypt działa poprawnie na moim serwerze z "call_user_func_array", ale dla mojego klienta zgłasza błąd (używam 5.3.x i on też musi być). .to wydaje się trochę dotknąć i odejść. –

16

z podręcznika dla call_user_func()

Zauważ, że parametry call_user_func() nie są przekazywane przez referencję.

Tak, jest twoja odpowiedź. Jednak istnieje sposób wokół niego, ponownie czytanie przez manual

call_user_func_array('test', array(&$b)); 

Powinny być w stanie przekazać je przez odniesienie.

+0

Jednak takie obejście działa tylko przed PHP 5.3, zgodnie z instrukcją. –

+0

Tak, to prawda, więc najlepiej byłoby nie używać tej metody, ponieważ nie byłaby kompatybilna w przód. –

+1

> Uwaga To nie będzie działać dla PHP> 5.3.0, więc używaj go z rozwagą. Jednak po prostu próbowałem na PHP 5.3.3 i działało bez ostrzeżenia/zawiadomień. wygląda na to, że wygląda na to, że występują błędy ukrywania call_user_func_array. – noxvile

4

Właśnie miał ten sam problem, zmieniając (w moim przypadku):

$result = call_user_func($this->_eventHandler[$handlerName][$i], $this, $event); 

do

$result = call_user_func($this->_eventHandler[$handlerName][$i], &$this, &$event); 

wydają się działać dobrze w PHP 5.3.

To nawet nie obejście myślę, że po prostu robi to, co powiedział :-)

+0

nieaktualna metoda. –

4

trzeba ustawić wartość zmiennej równa wynikowi funkcji, tak jak ...

$b = call_user_func('test', $b); 

i funkcja powinna być zapisana następująco ...

function test($a) { 
    ... 
    return $a 
} 

drugi przechodzą przez odniesienie pracy-a-rund są przestarzałe.

Powiązane problemy