2013-04-09 3 views
47

좀 프레임 워크에서이 코드 줄을 보았다?

+0

어떤 프레임 워크입니까? –

+0

예를 들어 laravel,하지만 코어에서만 발견되었지만 API를 사용하지 않는 경우 – Hello

+2

자세한 정보는이 페이지를 확인하십시오. http://stackoverflow.com/questions/5197300/new-self-vs-new-static –

답변

76

클래스의 멤버 함수 내에 new self()을 쓰면 해당 클래스의 인스턴스가 생깁니다. That's the magic of the self keyword.

그래서 :

class Foo 
{ 
    public static function baz() { 
     return new self(); 
    } 
} 

$x = Foo::baz(); // $x is now a `Foo` 

당신은 얻을 Foo 사용한 정적 한정자가 파생 클래스의 경우에도 :

class Bar extends Foo 
{ 
} 

$z = Bar::baz(); // $z is now a `Foo` 

당신이 (의미에서) 다형성을 사용하려면, 그리고 PHP에서 사용하는 한정자에주의를 기울여야 할 경우 static 키워드의 self 키워드를 바꿀 수 있습니다.

class Foo 
{ 
    public static function baz() { 
     return new static(); 
    } 
} 

class Bar extends Foo 
{ 
} 

$wow = Bar::baz(); // $wow is now a `Bar`, even though `baz()` is in base `Foo` 

이것은 PHP 기능인 late static binding으로 가능합니다. 다른보다 일반적인 사용을 위해 혼동하지 마십시오. 키워드 static.

+10

hmm..shortly : new static() - 확장 된 클래스에 관계없이 현재 클래스의 객체를 반환하고 new self() - 해당 메서드가 선언되거나 확장 된 클래스에서 객체를 반환합니다. 기능) ... 나는 이해한다? – Hello

+1

@Hello : 기본적으로. –

+1

그래, 나에게 충분하다.) 기본적으로 – Hello

관련 문제