首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在扩展的PHP类中从静态调用中获取类名?

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

Stack Overflow用户
提问于 2009-02-03 11:04:21
回答 6查看 68K关注 0票数 95

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

代码语言:javascript
复制
class MyAction extends Action {/* some methods here */}

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

代码语言:javascript
复制
Class Action {
 function n(){/* something */}
}

当我叫它的时候:

代码语言:javascript
复制
MyAction::n(); // it should return "MyAction"

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

有没有可能做到这一点?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-02-03 11:16:18

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

代码语言:javascript
复制
class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

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

延迟静态绑定,在PHP 5.3+中可用

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

虽然该特性没有引入新的魔术常量来告诉您调用的类名,但它提供了一个新函数get_called_class(),该函数可以告诉您调用静态方法的类名。下面是一个例子:

代码语言:javascript
复制
Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction
票数 180
EN

Stack Overflow用户

发布于 2014-09-06 06:28:43

从5.5开始,你可以使用use class keyword for the class name resolution,这将比进行函数调用快得多。也适用于接口。

代码语言:javascript
复制
// 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
票数 47
EN

Stack Overflow用户

发布于 2009-10-09 06:07:28

这不是理想的解决方案,但它适用于PHP低于5.3.0的版本。

代码是从septuro.com复制的

代码语言:javascript
复制
if(!function_exists('get_called_class')) {
    class class_tools {
        static $i = 0;
        static $fl = null;

        static function get_called_class() {
            $bt = debug_backtrace();

            if (self::$fl == $bt[2]['file'].$bt[2]['line']) {
                self::$i++;
            } else {
                self::$i = 0;
                self::$fl = $bt[2]['file'].$bt[2]['line'];
            }

            $lines = file($bt[2]['file']);

            preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
                $lines[$bt[2]['line']-1],
                $matches);

            return $matches[1][self::$i];
        }
    }

    function get_called_class() {
        return class_tools::get_called_class();
    }
}
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/506705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档