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

标签 php oop inheritance

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

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

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

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

当我调用它时:

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

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

有没有办法做到这一点?

最佳答案

__CLASS__ 总是返回使用它的类的名称,所以它对静态方法没有多大帮助。如果方法不是静态的,你可以简单地使用 get_class ($这个)。例如

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

}

class MyAction extends Action {

}

$foo=new MyAction;

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

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

现在 PHP 5.3 发布了,您可以使用 late static bindings ,它允许您在运行时而不是在定义静态方法调用时解析目标类。

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

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


class MyAction extends Action {

}


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

关于php - 如何从扩展 PHP 类中的静态调用中获取类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/506705/

相关文章:

php - 如何使用 Laravel 5.2 创建编辑表单

php - 计数不返回 SQL 中的总计数值

PHP:无法多次运行相同的 MySQL 查询

java - 如何提高效率?

c# - 如何使用户控件扩展一个扩展 UserControl 的类?

java - 为什么不能将 IOException() 对象添加到 "? extends Exception"的集合中?

php - 如何获取完整的文件路径

c++ - 访问类似于 boost::any 的类中的值

java - 如何将 class1 的 setText 设置为 class2?

c# - 从 Canvas 继承