PHP获取类名的一个问题(基类获取子类名)
classA{}classBextendsA{}希望在classA中获取到B类的名字B。求解。。。...
class A{
}
class B extends A{
}
希望在class A中获取到B类的名字B。求解。。。 展开
}
class B extends A{
}
希望在class A中获取到B类的名字B。求解。。。 展开
展开全部
从父类中获得子类名称,并不是不可能,
但是,这样做严重违背设计原则,属于设计错误。设计上不及格。。
应该检讨自己的需求和模型设计。
把具体应用情况说一说,我看看哪里做扭曲了
但是,这样做严重违背设计原则,属于设计错误。设计上不及格。。
应该检讨自己的需求和模型设计。
把具体应用情况说一说,我看看哪里做扭曲了
追问
好的,我定义了一个基类
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];
}
展开全部
这样吗?
<?
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();
?>
<?
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();
?>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不可以 的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |