【发布时间】:2016-12-15 23:23:59
【问题描述】:
寻找一种干净的方法来确定调用父类中方法的方法的类(在这种情况下,是父类或子类)。
我认为后期静态绑定可以处理这个问题,但似乎这只适用于直接调用静态方法,而不是从实例化对象的方法中。
考虑以下几点:
abstract class ParentClass {
public function parentMethod() {
self::_log("parent.non.static");
}
public static function parentStatic() {
self::_log("parent.static");
}
public static function getClassName() {
return __CLASS__;
}
protected static function _log($key) {
$prefix = 'graphite.key.prefix';
$class = static::getClassName(); // gets the object's class, not calling class
$g_key = "{$prefix}.{$class}.{$key}";
echo "{$g_key} \n";
// Graphite::increment($g_key);
}
}
class ChildClass extends ParentClass {
public function childMethod() {
self::_log("child.non.static");
}
public static function childStatic() {
self::_log("child.static");
}
public static function getClassName() {
return __CLASS__;
}
}
$obj = new ChildClass;
$obj->childMethod(); // graphite.key.prefix.ChildClass.child.non.static
$obj->parentMethod(); // graphite.key.prefix.ChildClass.parent.non.static
ParentClass::parentStatic(); // graphite.key.prefix.ParentClass.parent.static
ChildClass::childStatic(); // graphite.key.prefix.ChildClass.child.static
寻找一种简洁的方法来获取调用 _log() 方法的类,而无需将其作为参数传入。根本不必是静态的,但我在玩后期静态绑定,因为我认为这会起作用,但它只是获取实例化对象的名称,而不是调用方法的子/父类_log() 方法:-/
编辑:
为了清楚起见,我是在从实例化对象中获取调用 _log() 的方法的类名之后(如 parentMethod() 和 childMethod())不关心 _log() 是静态的还是不是。如果这能让事情变得更容易,那很好。但是静态 ParentClass::parentStatic() 和 ChildClass::childStatic() 只是为了显示后期静态绑定以及我认为可能有效的方法,而不是在实例化对象中调用
【问题讨论】:
-
get_class($this)也许? -
@JonathanKuhn 在静态方法中没有
$this。 -
@Barmar OP 特别指出它不必是静态的。
-
get_class($this) 不起作用,因为它将返回为 $obj 实例化的对象的名称,即 ChildClass,并且永远不会返回 ParentClass
-
知道了,所以不仅仅是孩子打电话给父母。它是调用父级的子级,它调用自身下的另一个方法。在这种情况下,您需要父母。比如
$instance->childMethod()调用parent::parentMethod1()调用self::parentMethod2()。在parentMethod2中,您想表明它是由parentMethod1(或者实际上只是父级)调用的。如果是这样的话,我知道的唯一方法就是解析debug_backtrace()。虽然,考虑到调用函数/类总是在关键1上,这并不是那么糟糕。
标签: php