문제

아래의 예는 클래스 계층의 코드입니다.내가 무엇을 찾고있는 방법을 결정하는 경우'ChildClass1'또는'ChildClass2'했다는 정적 방법 whoAmI()호출에 그것을 다시 없이 구현하는 각 어린이 클래스입니다.

<?php

abstract class ParentClass {

    public static function whoAmI () {

        // NOT correct, always gives 'ParentClass'
        $class = __CLASS__;

        // NOT correct, always gives 'ParentClass'. 
        // Also very round-about and likely slow.
        $trace = debug_backtrace();
        $class = $trace[0]['class'];

        return $class;
    }
}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ParentClass'
// Want to show 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ParentClass'
// Want to show 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";
도움이 되었습니까?

해결책 3

지금 PHP5.3 에서 널리 사용할 수 있는 야생,내가 원하를 함께 넣어 요약 이 질문에 대한 답변을 반영하여 새로 사용할 수 있는 기술이 있습니다.

에서 언급했듯이 다른 답변,PHP5.3 소개 늦은 정적인딩 을 통해 새로운 static 키워드입니다.뿐만 아니라,새로운 get_called_class() 기능도 사용할 수 있는 데만 사용할 수 있는 클래스 내에서 방식(인스턴스 또는 정적).

를 결정하기 위한 목적상 클래스로에게 물어 이 질문 get_called_class() 기능 적합합니다:

<?php

abstract class ParentClass {

    public static function whoAmI () {
        return get_called_class();
    }

}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

사용자 기여 노트 get_called_class() 함 샘플을 구현하는 작업해야 합 PHP5.2 뿐만 아니함으로써 사용 debug_backtrace().

다른 팁

내가 믿는 당신이 무엇을 가리키고 있는 것은 알려진 php 버그입니다.Php5.3 는 것을 목표로 이 문제를 해결하기 위해 새로운 늦게 정체되는 바인딩 기능입니다.

http://www.colder.ch/news/08-24-2007/28/late-static-bindings-expl.html

클래스의 식별은 종종 현상은 잘 이해한 다형성이다.

클라이언트의 ChildClass1 및 ChildClass2 필요가 없 그들을 구별한다.

없는 곳이 모든 클래스에 관해서 물어보아야 합니다 someObject.whoAmI().

있을 때마다 쓰는 충동 if someObject.whoAmI() == 'ChildClass1' { do X(someObject) } 당신은 정말 추가 X() 방법 ParentClass 다양한 구현에서는 다양한 ChildClasses.

"이런 종류의 실행할 시간 입력 id"할 수 있는 거의 항상으로 대체로 다형 클래스 디자인입니다.

로 PHP5.3 것이 가능하의 사용과 static 키워드, 하지만 지금은 그것을 할 수 없습니다.

No.기 PHP5.3.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top