인프런 커뮤니티 질문&답변

석ᄃᄀ님의 프로필 이미지
석ᄃᄀ

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

03 - 정적 메서드와 늦은 정적 바인딩 (Static)

Context에 대해서 궁금한게 있습니다

작성

·

194

0

안녕하세요 궁금한게 있습니다
 
static::who메소드를 호출하는 부분에서 부모 Class 또는 자식 Class에 static::(임의의 메소드)가 없으면 부모 또는 자식에서 메소드를 찾는건가요?
왜냐하면 아래 코드 실행 결과가 이렇게 나왔습니다
 
string(5) "A Foo" string(5) "B Foo" string(1) "B"
 
 
class A
{
    public static function foo()
    {
        var_dump('A Foo');
        static::who();
    }
    public static function who()
    {
        var_dump(__CLASS__);
    }
}
 
class B extends A
{
    public static function test()
    {
        self::foo();
    }
    public static function who()
    {
        var_dump('B Foo');
        var_dump(__CLASS__);
    }
}

$b = new B();
$b->test();
 
 

답변 1

2

정상우님의 프로필 이미지
정상우
지식공유자

안녕하세요. 답변이 늦어 죄송합니다. 코드를 살펴보죠.

일단, 상속에서 자식클래스에서 찾을 수 없는 경우에는 부모클래스에서 찾는게 기본적인 동작이라고 보시면 됩니다. 그 예로 B::test() 에서 self::foo() 를 시도하였으나 찾지못하였기 때문에 부모의 A::foo() 를 호출(A Foo)하였습니다.

A::foo() 에서 static::who() 를 호출, 그러나 A 가 아닌 B Foo 가 나온 것은 Static Context 의 경우 Lazy 하게 동작하기 때문입니다. 따라서 A::who() 가 아닌 B::who() 가 호출되었습니다. 만약 static::who() 가 아니라 self::who() 였다면 A::who() 가 호출되었을 것입니다. 이 과정에서 따라  B::test()->A::foo()->B::who() 가 호출되었으므로 출력은 A Foo, B Foo, B 순서로 나오게됩니다.

석ᄃᄀ님의 프로필 이미지
석ᄃᄀ
질문자

정확한 답변 감사드립니다 선생님 강의 잘 보고 있습니다 : )

석ᄃᄀ님의 프로필 이미지
석ᄃᄀ

작성한 질문수

질문하기