2012-04-12 2 views
9

PHP에 따르면, 클래스 :: 자기는 항상 클래스 자체를 가리키는,하지만 난이 코드를 쓴, 이상한 일이 발생합니다'자체'는 상속 된 클래스에서 정확히 어떻게 작동합니까?

foo() from C_foo 
foo() from C_bar 
:
class C_foo{ 
    function foo() { return "foo() from C_foo"; } 
    function bar() { echo self::foo(); } 
} 

class C_bar extends C_foo{ 
    function foo() { return "foo() from C_bar"; } 
} 

C_foo::bar(); 
C_bar::bar(); 

내가 출력이되었을 것이라고 생각

는하지만 사실 :

foo() from C_foo 
foo() from C_foo 

는 부모 클래스의 자기 정확히으로 상속되지 않음을 의미 자식,이 더 작동합니다 :

foo() {return parent::foo();} 

그 기능은 PHP 또는 버그입니까? 아니면 이런 뜻일까요? 나는 클래스 자체에서 개체를 만드는 이야기하려고 노력으로

그렇지 않으면 같은 일이 발생되면, 코드는 다음과 같은 것입니다 :

class Models { 
    function find($exp) { 
     ... 
     ... 

     $temp_model = new self(); 
     ... 
     ... 
    } 
} 

class Something extends Models {...} 

$somethings = Something::find("..."); 

어쩌면 당신이 변수를 설정하지 않는 이유 "물어 보곤 사람 클래스의 값을 사용하고 변수를 __construction 함수로 사용합니까? " 이처럼

:

... 
... 
function find($exp) { 
    ... 
    ... 
    $class_name = __class__; 
    $temp_model = new $class_name(); 
    ... 
    ... 
} 
... 

는 사실 그했다, 그리고 더 이상한 결과를 얻었다 : 클래스가 어떤 속성이나 기능을하지만 find(), 또는이없는 경우에만 작동

을 함수가 존재할 수있는 곳에서 변수가 표시된다는 오류가 튀어 나옵니다.

답변

-3

PHP에서 클래스는 객체가 아닙니다. 따라서 정적 메서드의 상속은 없습니다 (실제로는 전역 함수와 유사합니다).

그래서 C_foo가 self라고 말하면, 항상 C_foo를 의미합니다 (C_bar에서 메서드를 호출 한 경우에도 마찬가지입니다).

추상 클래스 메소드로 인스턴스를 만들려면 Factory 패턴을 사용해보십시오.

+0

덕분에 많이 나는 공장 패턴 : –

1

이것은 부모 클래스의 메서드를받는 클래스가 해당 클래스에 속하기 때문입니다. 따라서 :

$ bar는 bar이므로 self ::는 Foo가 아니라 Bar를 나타냅니다. 그 방법은 Foo에서 나온 것이지만.

이것은 자바와 다를 수 있지만, PHP가 내부적으로 상속하는 방법을 나타냅니다.

+0

지금 코드를 변경하려고 해요 해보자, 내가 정말이 더 깊이 갈 필요가있을 수 있습니다 언어, 고마워 :) –

+0

예, PHP는 상속에 대해 다르게 생각합니다. 그것은 덜 '스택'과 더 많은 '병합'입니다. –

+0

... 흠 .. 알았어, 익숙해 지려면 시간이 좀 걸릴거야. –

16

'후기 정적 바인딩'으로 알려진 PHP 기능에 대해 설명하는 것처럼 들립니다.

PHP는 self::static::의 두 가지 구문을 제공합니다.

static은 PHP 5.3에 도입되었습니다. 많은 사람들이 당신을 설명하기 위해 self을 사용할 것으로 예상했기 때문입니다.

더의 PHP 설명서를 참조하십시오 : http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

문서를 보니 ~ 고마워. :) –

관련 문제