PHP获取类名的一个问题(基类获取子类名)

classA{}classBextendsA{}希望在classA中获取到B类的名字B。求解。。。... class A{
}
class B extends A{
}
希望在class A中获取到B类的名字B。求解。。。
展开
 我来答
百度网友9308069
2011-06-28 · TA获得超过1万个赞
知道大有可为答主
回答量:3947
采纳率:89%
帮助的人:1942万
展开全部
从父类中获得子类名称,并不是不可能,
但是,这样做严重违背设计原则,属于设计错误。设计上不及格。。
应该检讨自己的需求和模型设计。

把具体应用情况说一说,我看看哪里做扭曲了
追问
好的,我定义了一个基类
class Action{
function show($name,$data=array(),$path=''){
//name是模板的名称,传入index就是用模板index.tpl.html
}
}
class indexAction extends Action{
$this->show('index',$data);
}

而我现在不想传入参数index.直接用$this->show($data); 自动获取类名indexAction,并使用模板index.tpl.html.
谢谢
追答
理解成需要统一的调用接口,可以改用一个模式,这是上策
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];
}
百度网友2f855f484
2011-06-28 · TA获得超过487个赞
知道小有建树答主
回答量:403
采纳率:0%
帮助的人:326万
展开全部
这样吗?

<?
class A{
function __construct(){
echo 'child class name is:'.$this->getClassname();
}

function getClassname(){
return $this->name;
}
}

class B extends A{
protected $name = 'B';
}

$obj = new B();
?>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Phper
2011-06-28 · TA获得超过1210个赞
知道小有建树答主
回答量:625
采纳率:0%
帮助的人:682万
展开全部
不可以 的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式