2009-10-09 18 views
6

Chcę wywołać funkcję z call_user_func_array, ale zauważyłem, że jeśli argument jest odniesieniem w definicji funkcji i jest prostą wartością w call_user_func_array, pojawia się następujące ostrzeżenie: Ostrzeżenie: Parametr 1 do testu() powinien być odniesienia, wartość podanaPHP Jak sprawdzić, czy zmienna jest odniesieniem?

Oto prosty przykład tego, co próbuję zrobić:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

Moje pytanie brzmi: jak mogę wiedzieć, czy wartość (w tym przypadku pierwsza wartość $ args) jest referencją czy nie?

Odpowiedz

2

Sprawdź komentarze na tej stronie dokumentacji PHP:

http://php.net/manual/en/language.references.spot.php

+1

wszystko co widzę to funkcje, aby sprawdzić, czy dwóch tablic/obiektów/zmienne są skierowane do tego samego obszaru pamięci przez modyfikację jednej i sprawdzenie, czy drugi też jest zmodyfikowany. W moim kodzie (nie w przykładzie, rzeczywistym), mam tylko tablicę argumentów i chcę wiedzieć, czy jeden argument jest referencją. W ten sposób mogę rzucić błąd, jeśli funkcja oddzwaniania chce referencji, a tablica zawiera prostą wartość. –

+0

To już wyzwala ostrzeżenie, które jest przeznaczone dla programistów. Jaki błąd chcesz? Możesz [ustawić niestandardową procedurę obsługi błędów] (http://php.net/set_error_handler), jeśli chcesz zmienić zachowanie. – cmbuckley

4

Nie, chodzi o to, że pierwszy parametr funkcji jest przekazywany przez referencję (czyli funkcję można modyfikować argumentu zakres dzwoniącego). Dlatego musisz przekazać zmienną lub coś, co można przypisać jako pierwszy argument. Po utworzeniu tablicy takiej jak array($a), po prostu kopiuje ona wartość zmiennej $a (która jest 0) do gniazda w tablicy. W żaden sposób nie odwołuje się do zmiennej $a. A potem, kiedy wywołać funkcję, to jest tak jeśli robisz to, co nie działa:

test(0) 

Jeśli naprawdę chciał, można umieścić $a do tablicy przez odniesienie, ale to trochę trudne :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

Co do tego, jak można powiedzieć, że element tablicy jest odniesieniem ... to jest trudne. Można zrobić var_dump() na tablicy, i poszukać „&” symbol:

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

Tak, wiem, że kod działa w ten sposób. Chciałem tylko, aby upewnić się, że tablica $ args (która może zawierać wszystko, ponieważ w moim kodzie jest przekazywana przez inną funkcję) została utworzona w ten sposób, aby uniknąć błędu podczas wywoływania funkcji call_user_func_array. Dlatego chciałem wiedzieć, jak sprawdzić, czy zmienne w tablicy były referencjami czy nie. –

Powiązane problemy