Ниже приведен пример иерархии классов и кода. То, что я ищу, - это способ определить, вызвал ли у 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";
@ S.Lott Я полностью согласен с тем, что такой метод был бы непрозрачной абстракцией при использовании в реальном коде. В этом случае метод только для того, чтобы обеспечить понятный образец. Моя причина в том, что вы хотите определить дочерний класс, так это то, что я могу использовать методы создания статических экземпляров, которые разделяются всеми членами иерархии классов, но все же вызывают соответствующий дочерний-конструктор. – 2009-09-06 03:54:30