一尘不染

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

php

我有两节课:ActionMyAction。后者声明为:

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

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

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

当我称它为:

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

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

有什么可行的方法吗?


阅读 232

收藏
2020-05-26

共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_drawn_class(),它可以告诉您调用了静态方法的类的名称。下面是一个示例:

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


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction
2020-05-26