如何从扩展 PHP 类中的静态调用中获取类名?

2022-08-30 07:43:03

我有两个类:和.后者声明为:ActionMyAction

class MyAction extends Action {/* some methods here */}

我所需要的只是类中的方法(仅在其中,因为会有很多继承的类,我不想在所有类中实现此方法),这将从静态调用返回classname。这就是我要说的:Action

Class Action {
 function n(){/* something */}
}

当我称之为:

MyAction::n(); // it should return "MyAction"

但是,父类中的每个声明只能访问父类变量,该变量的值为“Action”。__CLASS__

有什么可能的方法来做到这一点吗?


答案 1

__CLASS__始终返回使用它的类的名称,因此它对静态方法没有多大帮助。如果该方法不是静态的,您可以简单地使用get_class($this)。例如:

class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

$foo->n(); //displays 'MyAction'

后期静态绑定,在 PHP 5.3+ 中可用

现在 PHP 5.3 已经发布,您可以使用后期静态绑定,这允许您在运行时(而不是在定义静态方法时)解析静态方法调用的目标类。

虽然该功能没有引入一个新的魔术常量来告诉你被调用的类名,但它确实提供了一个新的函数,get_called_class(),它可以告诉你调用静态方法的类的名称。下面是一个示例:

Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction

答案 2

从 5.5 开始,您可以使用 class 关键字进行类名解析,这比调用函数要快得多。也适用于接口。

// C extends B extends A

static::class  // MyNamespace\ClassC when run in A
self::class    // MyNamespace\ClassA when run in A
parent::class  // MyNamespace\ClassB when run in C
MyClass::class // MyNamespace\MyClass

推荐