寻找一种干净的方法来确定调用父类中方法的方法的类(在本例中为父类或子类)。
我认为后期静态绑定可以处理这个问题,但似乎只能直接调用静态方法,而不是来自实例化对象的方法。
请考虑以下事项:
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()方法: - /
编辑:
为了清楚起见,我在获取实例化对象(如parentMethod()和childMethod())中调用_log()的方法的类名后,不在乎_log( )是静态的还是不静态的。如果这样更容易,那很好。但是静态ParentClass :: parentStatic()和ChildClass :: childStatic()只是为了显示后期的静态绑定以及我认为可能有用的内容,而不是在实例化对象中调用
答案 0 :(得分:0)
get_class将获取类实例的类名。这也可以在类中的$this
上调用。如果你有一个扩展/实现另一个的类,$this
将引用实例化的类,即子类。
另一个选择是使用debug_backtrace来获取导致您当前所在位置的功能堆栈。您可以解析返回的数组以获得所需的任何内容,包括行号,类,函数,方法等等。
答案 1 :(得分:0)
http://php.net/manual/en/function.get-called-class.php
class One {
public static function test() {
echo get_called_class() . PHP_EOL;
}
}
class Two extends One {}
One::test();
Two::test();
输出:
One
Two
此外,根据文档static::class
中的顶级注释,也适用于PHP 5.5。