在父类方法

时间:2016-12-15 23:24:00

标签: php

寻找一种干净的方法来确定调用父类中方法的方法的类(在本例中为父类或子类)。

我认为后期静态绑定可以处理这个问题,但似乎只能直接调用静态方法,而不是来自实例化对象的方法。

请考虑以下事项:

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()只是为了显示后期的静态绑定以及我认为可能有用的内容,而不是在实例化对象中调用

2 个答案:

答案 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。