2012-02-07 8 views
0

"="개체를 참조로 지정하고 다른 변수 및 문자열 및 정수 같은 데이터 형식을 사용하면 "= &"을 사용하여 참조로 할당해야 함을 이해합니다. "= &"을 사용하여 명시 적으로 개체를 할당하면 할당에 영향을 미치지 않는 것처럼 보입니다. 그러나 개체를 전역에 할당 할 때 해당 개체는 전역에 할당됩니다.PHP에서 전역 변수, 객체 및 참조 - 어떻게 작동합니까?

<?php 

$global_obj = null; 

class my_class { 

    var $value; 

    public function __construct() { 
     global $global_obj; 

     $global_obj =& $this; 
     $GLOBALS['some_var'] = $this; 
    } 
} 

$a = new my_class(); 
$a->my_value = 5; 
$global_obj->my_value = 10; 

echo 'A: ' . $a->my_value; //5 
echo '<br />'; 
echo 'Global Object: ' . $global_obj->my_value; //10 
echo '<br />'; 
echo 'Globals Array Value: ' . $some_var->my_value; //5 

?> 

참조로 $ global_obj에 할당 $이 위의 코드에서 앰퍼샌드를 제거하는 경우 :

는 다음과 같은 고려하십시오. 제 질문은 입니다. 앰퍼샌드를 사용하면 왜 이런 현상이 멈추는 걸까요?? 여기에 무슨 일이 일어나고 무엇

감사

답변

2

$global_obj 변수 $this에 대한 참조 것입니다. $this은 현재 객체에 대한 참조가 될 메소드 내부에 존재하는 의사 변수입니다. 하지만 누가 범위 범위를 벗어날 때 $this에 무슨 일이 발생하는지 압니다. $this을 참조하는 것이 좋습니다.

실제로 조금 더 조사하면 생성자가 반환 된 후 $global_obj을 검사하면 그 값은 null입니다. 메소드가 종료 된 후 PHP 엔진은 $this을 null로 설정하고 (은 변수 $this에 대한 참조이므로 그 뒤에옵니다). null에 속성을 설정하면 stdClass 클래스의 새 객체가 자동으로 인스턴스화되므로 성공한 것처럼 보입니다. 물론 이것은 $a에있는 것과는 완전히 다른 것입니다.