我有两个班:Action
和MyAction
.后者被宣布为:
class MyAction extends Action {/* some methods here */}
我需要的只是Action
类中的方法(仅在其中,因为将有很多继承的类,我不想在所有这些中实现此方法),它将从静态调用返回classname.这就是我在说的:
Class Action { function n(){/* something */} }
当我打电话给它时:
MyAction::n(); // it should return "MyAction"
但是父类中的每个声明只能访问父类__CLASS__
变量,该变量的值为"Action".
有没有办法做到这一点?
__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,您可以使用后期静态绑定,它允许您在运行时解析静态方法调用的目标类,而不是在定义它时.
虽然该功能没有引入一个新的魔术常量来告诉你所调用的类名,但它确实提供了一个新函数get_called_class(),它可以告诉你调用静态方法的类的名称.这是一个例子:
Class Action { public static function n() { return get_called_class(); } } class MyAction extends Action { } echo MyAction::n(); //displays MyAction
从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
它不是理想的解决方案,但它适用于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(); } }
现在(当5.3到达时)它非常简单:
http://php.net/manual/en/function.get-called-class.php