2011-03-09 5 views
2
<?php class gdTemplateDB { 
     [...] 
    function rewrite_dependencies($section, $id) { 
     global $wpdb, $table_prefix; 
     /*var_dump($this); 
     die;*/ 
     **include($this->plugin_path.'code/t2/templates.php');** 
     [...] 
     } 
?> 

저는 GD 별 등급이라는 워드 프레스 플러그인의 코드를 파고 있습니다.
내가 알아낼 수 없습니다이 "마법"가지 이유 :"Magic" "class"

  1. 분명히 위의 클래스는 어떤 부모가없는,하지만 난 $이 포인터를 위해서 var_dump 때, 그것은라는 다른 클래스의 인스턴스로 밝혀 GDStarRating 및 GDStarRating에도 부모가 없습니다! 그리고 $ this 포인터를 임의적으로 다시 인스턴스화 할 수 없다는 것을 알고 있습니다. 그래서 $ this 포인터가 왜 그렇게 행동하는지 이해할 수 없습니다.
  2. 기능 rewrite_dependencies는 gdsrAdmFunc라는 다른 클래스 (gdTemplateDB::rewrite_dependencies하지 $instance->rewrite_dependencies)에서 호출 정적, 그리고 그 클래스는 GdStarRating 어떤 부모 - 자식 관계가 없습니다. 그러나 그것은 잘 작동합니다.

저에게 "마법"적인 일이 발생할 수있는 이유는 무엇입니까?

답변

1

class a{ 
    function aa(){ 
    var_dump($this); 
    } 
} 

class b{ 
    function bb(){ 
    a::aa(); 
    } 
} 

$ob = new b(); 
$ob->bb(); 

a::aa() 출력 다음은 $

object(b)#1 (0) { // $this is instance of b 
} 

이 클래스 A의 클래스 B의 대상이기 때문에,

함수 bb 클래스 b에서 클래스 a의3210 함수 aa이 호출됩니다.

bbb이 클래스 b의 개체에서 호출됩니다.

2

PHP는 이전 버전과의 호환성을 위해 정적이 아닌 메서드를 정적 메서드로 호출 할 수 있습니다. 이 방법으로 비 정적 메서드를 호출 할 때는 이 아닌이 설정되지 않았습니다. $this입니다. 대신 다른 인스턴스의 값이 새 메서드로 새어 나옵니다.

다음과 같은 코드를 사용하여이 문제를 복제 할 수 있습니다 :

class A { 
    function foo() { 
    global $c; 
    echo "In A: " . ($this === $c ? 'true' : 'false') . "\n"; 
    } 
} 

class B { 
    function bar() { 
    global $c; 
    echo "In B: " . ($this === $c ? 'true' : 'false') . "\n"; 
    A::foo(); 
    } 
} 

class C { 
    function baz() { 
    global $c; 
    echo "In C: " . ($this === $c ? 'true' : 'false') . "\n"; 
    B::bar(); 
    } 
} 

$c = new C(); 
$c->baz(); 

인쇄 어느 :

In C: true 
In B: true 
In A: true 

을 그러나, 다음, PHP가 제대로 작동하고 $this가 정의되지 않는 정적 방법을 표시합니다. 이 예에서는 static function foo()A::foo()를 선언하는 경우, 그리고 B::bar()static function bar(), 당신이 대신 참조 :

In C: true 

Notice: Undefined variable: this in test.php on line 13 
In B: false 

Notice: Undefined variable: this in test.php on line 6 
In A: false 
여기
+0

가 어떻게 반이 질문에 대답에 대한 대답의 절반 지점을 제공합니까? :) – Ben

+0

어쩌면 나는 충분히 명확하지 않았지만 이것은 두 가지 질문을 설명합니다. $ this 포인터는 마술처럼 클래스에서 상속받지 않습니다.당신은 단지 다른 클래스에서 $ this 포인터가 다른 함수로 출혈하는 것을보고 있습니다. –

+1

아, 촉감. +1 – Ben

1

추출 함수 호출이 있습니까? $이 포인터 abitrarily이 기능을 사용하여 다시 인스턴스화 할 수 있습니다 : P

extract(array('this' => new stdClass)); 
var_dump($this); // object(stdClass)[1] 
+0

나는 ** 추출 **을 볼 수 있지만, 어쨌든, 그 정보는 나를 위해 도움이됩니다 감사합니다 : D 조 – perfwill

관련 문제