2010-04-24 5 views
3

초진시 코드다른 설명

$global_obj = null; 
class my_class 
{ 
     var $value; 
     function my_class() 
     { 
       global $global_obj; 
       $global_obj = &$this; 
     } 
} 
$a = new my_class; 
$a->my_value = 5; 
$global_obj->my_value = 10; 
echo $a->my_value; 

에코 5 없음 10.

"가 보일 것이라고 my_class 저장 생성자는 $ global_obj 변수 내부 자체 참조. 따라서, 우리는 나중에 $ global_obj-> my_value의 값을 10으로 변경하면 $ a의 해당 값도 변경 될 것이라고 예상 할 수 있습니다. 불행히도 new 연산자는 참조를 반환하지 않고 새로 만든 객체의 복사본을 반환합니다 . "

아직 이해가 안되니 누구나 다르게 설명하고 이해하도록 도와주세요.

답변

5

이것이 작동하는 이유는 모르지만 $this 앞에있는 &을 전역 변수에 할당하는 동안 제거하면 작동합니다.


그 개념을 설명하기 위해 다음 코드 부분 :

    : 여기


    10 
    
    이 코드와의 차이점은 다음과 같습니다

    $global_obj = null; 
    class my_class 
    { 
        public $my_value; 
        public function __construct() 
        { 
         global $global_obj; 
         $global_obj = $this; 
        } 
    } 
    $a = new my_class; 
    $a->my_value = 5; 
    
    $global_obj->my_value = 10; 
    echo $a->my_value; 
    

    다음과 같은 출력을 제공합니다

  • 나는 &$this하기 전에 : 객체로 작업 할 때 PHP 5, 그럴 필요가 내가 실제 PHP 5에 코드를 번역
  • 이없는 다음 constructor
  • 사용
    • __constructpublic/protected/private, 그리고 varproperties
,691에 대한

Strict standards: Creating default object from empty value 

참고 :

  • 내가 PHP 5.3을 사용 해요 (!) 참고로


    , 당신이 게시 코드는 당신에게 다음과 같은 경고를 제공해야합니다.

    PHP 매뉴얼의 References Explained 부 거치지 :

  • E_ALL 좀 더 검색 후 E_STRICT(source)



수정을 포함하지 않는다 2 ,보다 구체적으로는 What References Do 페이지, (인용) 을 말한다 주어진 경고가 :

당신이 변수에 대한 참조를 할당하면

는 함수 내에서 global로 선언, 참조는 함수 안에서만 볼 수 될 것입니다.
$GLOBALS 배열을 사용하여이를 피할 수 있습니다.

예가 있습니다.


코드에 $GLOBALS를 사용하려고, 나는 코드의이 부분이 있습니다

$global_obj = null; 
class my_class 
{ 
    public $my_value; 
    public function __construct() 
    { 
     $GLOBALS['global_obj'] = & $this; 
    } 
} 
$a = new my_class; 
$a->my_value = 5; 

$global_obj->my_value = 10; 
echo $a->my_value; 

을 그리고 나는 다음과 같은 출력을 얻을 : 작동하는 것 같다

10 

를 ;-)


01 이에 의해방법 :

public function __construct() 
{ 
    global $global_obj; 
    $global_obj = & $this; 
} 

그것은 작동하지 않습니다 ...


그래서 당신이 여기 global,하지만 $GLOBALS을 사용해서는 안 보인다.

설명서에 주어진 설명은 다음과 같습니다

$var =& $GLOBALS['var'];에 바로 가기로 약 global $var;을 생각하십시오.
$var에 대한 또 다른 참조를 할당하면 만 로컬 변수의 참조를 변경합니다.



그리고 , 그것은 말했다 그냥 있도록 : 전역 변수를 사용하는 것은 일반적으로 매우 좋은 생각이 아니다 - 그리고,이 특정 상황에서, 그것은 아주 나쁜 생각 같은 느낌 .. .

(지금은, 글쎄, 난 ;-) 당신의 호기심을 이해할 수있는 이유는 ... 바로 이해하는 것이 문제는 경우)

+0

아니라, 그는 당신에게 자신의 갱신에 꽤 철저한 설명했다. (+1) – mpen

+0

Mr. Martin, 인증 연습 테스트 책입니다. 나는 교정 할 필요가 없다. 나는 왜 그것이 5가 아니라 10인지를 알아야합니다. 다른 지식을 테스트하기 위해 다른 말씨를 사용할 수 있습니다. –

+0

미안하지만, 내가 게시 한 것보다 더 잘할 수 있다고 생각하지 않습니다. 특히 매뉴얼의 참조 섹션을 가리키는 편집 내용을 추가했습니다. 설명이 정확하게 내가 그 페이지에서 인용 한 내용이라고 생각합니다. * (내 대답의 마지막 인용문이 코드가 작동하지 않는 이유 여야합니다.) * –