问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-06 02:55

我来回答

3个回答

热心网友 时间:2022-04-06 04:24

从父类中获得子类名称,并不是不可能,
但是,这样做严重违背设计原则,属于设计错误。设计上不及格。。
应该检讨自己的需求和模型设计。

把具体应用情况说一说,我看看哪里做扭曲了追问好的,我定义了一个基类
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];
}

热心网友 时间:2022-04-06 05:42

这样吗?

<?
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();
?>

热心网友 时间:2022-04-06 07:17

不可以 的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
酸醋萝卜怎么做又脆又好吃 账簿启用及交接表填写的步骤 账簿启用及交接表怎样填写 说的是精神分裂症,吃了二年多的药,分别是利培酮片,苯海索片,补脑_百度... 精神分裂症急性期适当的治疗方法 快递三斤荔枝的话要多少钱? 求高手指点一个plc编程问题,计算时间差,还有时间比较后,输出执行... 你好高手 我现在买了个松下fp0的PLC我想写一个步进程序,请问能否... 【plc执行程序步骤】 plc执行程序时 若有一步不能满足条件而执行不了... 电脑屏幕的壁纸怎么更换? php ReflectionFunction 如何获取类中的函数 php中怎么用ReflectionClass中的方法获取类信息 PHP是否有函数,可以查看当前所有已经定义了的类? PHP中如何获得当前类的名称,而实例化后获取子类的名称 PHP-php怎样自动获取被调用的类名 phpstrom怎么查看一个类中的方法 php如何获取某个函数所属的类 php 怎么获取当前函数名称 ? php 如何把文字转成图片显示(象验证码那样) php 和 html 交互问题。想让php返回一个图片网址,以便html来在输出图片。前端怎样获得php返回信息? 怎么将HTML格式图片转换为普通图片格式。。。 html提交数据给php,jpgraph用php生成图片,如何在当前html中显示? PHP HTML转图片代码相关资料哪里有? PHP默认输出的是HTML代码,如何转换成效果输出? 急!html提交数据给php,用php生成图片,如何在html中显示? php将html转换成图片问题 php 如何实现html生成图片 php 如何将html转换成图片 php向MYSQL数据库插入。 PHP页面编码GB2312 数据编码UTF-8 插入特殊符号是?号如何解决 mysql模糊查询like中包含特殊字符在php中要如何处理 php 怎么做 内部的消息推送呢 有关php 调用ios push的问题 如何用 php代码实现 ios 等多台设备的推送信息功能 php使用JPush极光推送ios android自定义消息 PHP的iOS推送通知(没有权限)问题,怎么解决 怎样使用PHP实现服务器向APP推送消息 ios app 通知角标+1 php该怎么做 php ios 推送 可以使用curl吗 极光推送php服务器端怎么修改ios生产或开发平台 php 定时推送消息怎么做? PHP后台发出推送,通过 Firebase 给关联的APP做推送 PHP网站怎么推送消息到安卓手机? ios为什么php推送成功手机上收不到推送消息 Hybrid App 的消息推送是否可以用PHP实现 php 判断是否是时间格式 php 日期提交后怎么判断这个日期格式是否正确 php 判断日期格式是否正确 PHP 怎么样判断输入的是否是日期格式 PHP 判断是否为时间戳格式 PHP中如何判断一个字符串是否是合法的日期模式