Php 有没有办法在静态方法中检测目标类?
下面是一个示例类层次结构和代码。我要寻找的是一种方法来确定“ChildClass1”或“ChildClass2”是否调用了静态方法whoAmI,而无需在每个子类中重新实现它Php 有没有办法在静态方法中检测目标类?,php,oop,php-5.3,php-5.2,Php,Oop,Php 5.3,Php 5.2,下面是一个示例类层次结构和代码。我要寻找的是一种方法来确定“ChildClass1”或“ChildClass2”是否调用了静态方法whoAmI,而无需在每个子类中重新实现它 <?php abstract class ParentClass { public static function whoAmI () { // NOT correct, always gives 'ParentClass' $class = __CLASS__;
<?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";
我相信您所指的是一个已知的php错误。PHP5.3旨在通过一个新的后期静态绑定特性来解决这个问题
我相信您所指的是一个已知的php错误。PHP5.3旨在通过一个新的后期静态绑定特性来解决这个问题
否。请等待PHP5.3。否。请等待PHP5.3。类标识通常是未充分理解多态性的症状 ChildClass1和ChildClass2的客户端不需要区分它们 任何一个类都不应该在任何地方询问关于某个Object.whoAmI的问题 无论何时,当您有编写if someObject.whoAmI=='ChildClass1'{do XsomeObject}的冲动时,您都应该向父类添加一个X方法,并在不同的子类中使用不同的实现
这种运行时类型标识几乎总是可以用正确的多态类设计来代替。类标识通常是多态性未得到充分理解的症状 ChildClass1和ChildClass2的客户端不需要区分它们 任何一个类都不应该在任何地方询问关于某个Object.whoAmI的问题 无论何时,当您有编写if someObject.whoAmI=='ChildClass1'{do XsomeObject}的冲动时,您都应该向父类添加一个X方法,并在不同的子类中使用不同的实现
这种运行时类型标识几乎总是可以用适当的多态类设计来代替。从PHP5.3开始,可以使用,但目前不可能。从PHP5.3开始,可以使用,但是现在这是不可能的。既然PHP5.3在野外广泛使用,我想总结一下这个问题的答案,以反映新的可用技术 正如其他答案中提到的,PHP5.3通过一个新的关键字引入了。此外,还提供了一个新函数,该函数只能在类方法实例或静态中使用 为了确定本问题中提出的类,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";
其中包括一些示例实现,通过使用debug_backtrace也可以在PHP5.2中工作。既然PHP5.3在野外广泛可用,我想总结一下这个问题的答案,以反映新的可用技术 正如其他答案中提到的,PHP5.3通过一个新的关键字引入了。此外,还提供了一个新函数,该函数只能在类方法实例或静态中使用 为了确定本问题中提出的类,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";
其中包括一些通过使用debug_backtrace也可以在PHP5.2中工作的示例实现。@S.Lott我完全同意,如果在实际代码中使用这种方法,它将是一个泄漏的抽象。在这种情况下,该方法只是提供一个可理解的示例。我想要确定子类的原因是,我可以使用由类层次结构的所有成员共享的静态实例创建方法,但仍然调用适当的child-constructor.@S.Lott我完全同意,如果在实际代码中使用这种方法,将是一个泄漏的抽象。在这种情况下,该方法只是提供一个可理解的示例。我想要确定子类的原因是,我可以使用由类层次结构的所有成员共享的静态实例创建方法,但仍然可以调用相应的子构造函数。