Strzela się, gdy próbuję wywołać funkcję z argumentem poprzez odniesienieDlaczego pojawia się błąd "oczekiwano, że będzie referencją, wartość podana"?
function test(&$a) ...
przez
call_user_func('test', $b);
Strzela się, gdy próbuję wywołać funkcję z argumentem poprzez odniesienieDlaczego pojawia się błąd "oczekiwano, że będzie referencją, wartość podana"?
function test(&$a) ...
przez
call_user_func('test', $b);
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).
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.
Jednak takie obejście działa tylko przed PHP 5.3, zgodnie z instrukcją. –
Tak, to prawda, więc najlepiej byłoby nie używać tej metody, ponieważ nie byłaby kompatybilna w przód. –
> 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
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ł :-)
nieaktualna metoda. –
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.
@Artefakto Zostawiłem to pierwotnie, ponieważ instrukcja mówi, że tak nie jest w 5.3, ale zaktualizowałem swoją odpowiedź. –
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ść. –