2017-10-06 23 views
-1

: 함수의 내부를 unset()하면 파괴하려는 변수의 유형에 따라 달라질 수의전역 변수의 경우 unset()과 같은 동작이 다른 작업에서도 동일하지 않은 이유는 무엇입니까? 해제() 함수에서 PHP 문서 당으로

동작. 전역 변수가 함수 내에서 unset() 인 경우 로컬 변수 만 제거됩니다. 호출 환경의 변수는 unset()이 호출되기 전과 동일한 값을 유지합니다.

말 위에서 보여주는 코드 예제은 다음과 같습니다 :

지금 내 질문은 위의 동작은 내가 작성한 프로그램을 다음에 적용 할 수없는 이유
<?php 
function destroy_foo() 
{ 
    global $foo; 
    unset($foo); 
} 

$foo = 'bar'; 
destroy_foo(); 
echo $foo; // o/p is bar 
?> 

? 행동이 unset() 기능을 위해 작성된 코드의 동작과 위의 코드에서 다른 이유

<?php 
function increment_foo() 
{ 
    global $foo; 
    $foo++; 
} 

$foo = 36; 
increment_foo(); 
echo $foo; // o/p is 37 
?> 

내 의심의 여지가있다?

다른 말로하면, 첫 번째 코드에서 unset() 기능이 함수 내부의 로컬 변수로 제한된다는 것을 알고 싶습니다. 함수 외부의 전역 범위에서 값을 변경하지 않지만 작성한 코드에서 변경합니다 증가 기능은 전역 변수 범위의 값도 변경합니다. 내 코드에서 왜 함수 내부의 로컬 변수와 값을 변경/함수 밖의 변수에도 영향을 미치지 않을까요?

감사합니다.

+0

은 범위 문제 인 것 같습니다. – rtfm

+1

그것이 작동하는 방식과 문서화 된 방법입니다. 그것과는 별도로, 그것은 나에게 꽤 논리적 인 것처럼 보입니다 : 그것은 전역 변수에 대한 참조와 같습니다. 그래서 그것을 해제하고, 참조를 해제하고 그것을 수정하여 전역 변수를 변경합니다. 진짜 질문은 전역 변수를 사용하는 이유입니다 ;-) – jeroen

답변

2

이유는 global 키워드를 사용하면 전역 범위의 변수를 참조하는 로컬 변수가 만들어지기 때문입니다. 설정을 해제하면이 참조가 파괴됩니다.

$foo = 42;  // create variable with value 
$bar = &$foo; // create reference to $foo 
$bar++;   // increment $foo via reference 
unset($bar); // destroy reference 

var_dump($bar); // NULL 
var_dump($foo); // 43 

$foo = &$GLOBALS['foo']을하는 것이 global $foo을하는 것은 단지 속기 때문이다 넣어 또 다른 방법, 예를 들면 : 그것은이 코드 조각 비슷 첫 번째 예는 어쩌면 당신은, 예를 들어, 참조를 파괴하고 더 확실한 것을 만드는

function increment_foo() 
{ 
    $foo = &$GLOBALS['foo']; 
    $foo++; 
    unset($foo); 
    var_dump($foo); // NULL 
} 

$foo = 42; 
increment_foo(); 
var_dump($foo); // 43 

에 쓸 수있다 너는 $foo을 가리키고 있지만, 그 자체는 $foo이 아닙니다.