发布网友 发布时间:2022-04-06 02:55
共3个回答
热心网友 时间:2022-04-06 04:24
从父类中获得子类名称,并不是不可能,追答理解成需要统一的调用接口,可以改用一个模式,这是上策
class Action{
public $action_name;
function __construct($action_name) {
$this->action_name=$action_name;
}
function show(){
echo ' 模板名称:'.$this->action_name.'.tpl.html';
}
static public function create($action_name){
$class_name=$action_name.'Action';
if(class_exists($class_name)){
return new $class_name($action_name);
}else
exit('对象不存在.'.$action_name);
}
}
class IndexAction extends Action{
function show(){
parent::show();
echo '继续子类动作';
}
}
//统一的生成对象和调用
$ia=Action::create('index');
$ia->show();
=================
输出
模板名称:index.tpl.html
继续子类动作
================
如果非要“在基类获取子类名称”,需要用到PHP5.3的后期静态绑定,这是中策
class Action{
function show(){
$cls=get_called_class();
$tpl=substr($cls,0,strlen($cls)-6);
echo ' 模板名称:'.$tpl.'.tpl.html';
}
}
class IndexAction extends Action{
}
$ia=new IndexAction();
$ia->show();
=================
显示
模板名称:Index.tpl.html
= = = =
对于PHP版本小于5.3没有后期静态绑定,没有get_called_class(),就需要自己用慢而丑陋的代码实现。这是下策。
function get_called_class() {
$bt = debug_backtrace();
//debug($bt);
$l = 0;
do {
$l++;
$lines = file($bt[$l]['file']);
$callerLine = $lines[$bt[$l]['line']-1];
//debug($callerLine);
preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l]['function'].'/',
$callerLine,
$matches);
} while ($matches[1] == 'parent' && $matches[1]);
return $matches[1];
}
热心网友 时间:2022-04-06 05:42
这样吗?热心网友 时间:2022-04-06 07:17
不可以 的