当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从扩展PHP类中的静态调用中获取类名?》经验,为你挑选了4个好方法。

我有两个班:ActionMyAction.后者被宣布为:

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

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

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

当我打电话给它时:

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

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

有没有办法做到这一点?



1> Paul Dixon..:

__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


@Paul,谢谢!你刚用`get_called_class()`:)保存了我的一天......或者晚上

2> Ian Bytchek..:

从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



3> Jrgns..:

它不是理想的解决方案,但它适用于PHP <5.3.0.

代码是从septuro.com复制的

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();
    }
}



4> src091..:

现在(当5.3到达时)它非常简单:

http://php.net/manual/en/function.get-called-class.php


现在(当5.5已经到达(很久以前))它甚至更简单:http://stackoverflow.com/a/25694818/458356
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有