2009-03-25 8 views
1

함수에서 참조를 설정하려고합니다. 그러나, 나는이 일을 할 수 없다. 내가 시도PHP 함수 내부에서 참조를 설정하는 방법은 무엇입니까?

코드 :

function set(&$x, &$y) 
{ 
    $x =& $y[2]; 
} 

$y = array(
    0, 
    1, 
    array('something') 
); 

$x = array('old_val'); 
print "1. inited, x is:\n"; 
print_r($x); 

set($x, $y); 

print "\n2. now, x is: "; 
print_r($x); 

출력 :

1. inited, x is: 
Array 
(
    [0] => old_val 
) 

2. now, x is: Array 
(
    [0] => old_val 
) 

내가 $ 값 y로 동일하게 $ x의 값을 기대하고있다 [2]. 또한 $ x에 대한 추가 수정은 $ y [2]를 변경해야합니다. (C의 포인터 할당에서와 같이 : x = &y[2];) 내가 뭘 잘못하고 있니? 어떤 제안도 감사합니다.

편집 : 실제로 테스트 코드의 function set()은 테스트 용으로 단순화 된 코드입니다. 이것은 실제로 select_node (& $ x, & $ tree, $ selector)입니다 : $ selector에 일치하는 트리에서 $ x에 할당하는 노드를 선택합니다.

+0

좋아 참조

$x =& set($x,$y); 

:

function &set(&$x, &$y) {} 

을 그리고 다음과 같이 호출 , 엄청 이상해. 함수 내에서 $ x에 무언가를 할당하면 (배열로 되돌려 놓고 함수 밖에서 설정됩니다) 작동하지만, 다른 방법으로는 작동하지 않습니다 ... hmmm. –

답변

3

참고 문헌은 포인터가 아니며 약간 다르게 적용됩니다.

set() 함수의 $ x 변수가 $ y [2]와 같은 위치에 바인딩되어 있지만 set()의 $ x가 set의 외부에있는 $ x와 같지 않습니다.). 그들은 둘 다 같은 위치를 가리 키지 만, set() 내부의 것을 단지 갱신했다. 이것은 set()이 리턴하면 더 이상 관련이 없다. $ x를 호출 범위에 바인딩 할 수있는 방법이 없습니다. 함수 안에 존재하지 않기 때문입니다.

참조 : http://ca3.php.net/manual/en/language.references.arent.php

당신은 선언 할 수 있습니다 설정() 참조 돌아갑니다 : http://ca3.php.net/manual/en/language.references.return.php

1

여기에 아무런 문제가 없습니다. x (기능이 ) 세트()x의 글로벌 변수 로컬 별칭입니다. 즉, 함수 세트()에서 xx은 동일한 값을 가리 킵니다. 이 작업을 수행 한 후 :

$x =& $y[2]; 

지역 X 지금 $ (Y)의 값을 포인트 [2]하지만 글로벌 X 여전히 이전 값을 가리키는. 이 페이지를 읽어야합니다. http://php.net/references

관련 문제