방법은 없을 감지하는 대상 클래스에서 정체되는 방법?
문제
아래의 예는 클래스 계층의 코드입니다.내가 무엇을 찾고있는 방법을 결정하는 경우'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.