Ant*_*ton 80 php oop inheritance
我有两个班:Action和MyAction.后者被宣布为:
class MyAction extends Action {/* some methods here */}
Run Code Online (Sandbox Code Playgroud)
我需要的只是Action类中的方法(仅在其中,因为将有很多继承的类,我不想在所有这些中实现此方法),它将从静态调用返回classname.这就是我在说的:
Class Action {
function n(){/* something */}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给它时:
MyAction::n(); // it should return "MyAction"
Run Code Online (Sandbox Code Playgroud)
但是父类中的每个声明只能访问父类__CLASS__变量,该变量的值为"Action".
有没有办法做到这一点?
Pau*_*xon 166
__CLASS__始终返回使用它的类的名称,因此静态方法没有多大帮助.如果方法不是静态的,你可以简单地使用get_class($ this).例如
class Action {
public function n(){
echo get_class($this);
}
}
class MyAction extends Action {
}
$foo=new MyAction;
$foo->n(); //displays 'MyAction'
Run Code Online (Sandbox Code Playgroud)
现在已经发布了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
Run Code Online (Sandbox Code Playgroud)
Ian*_*hek 38
从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
Run Code Online (Sandbox Code Playgroud)
Jrg*_*gns 16
它不是理想的解决方案,但它适用于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();
}
}
Run Code Online (Sandbox Code Playgroud)
src*_*091 12
现在(当5.3到达时)它非常简单:
http://php.net/manual/en/function.get-called-class.php
| 归档时间: |
|
| 查看次数: |
61298 次 |
| 最近记录: |