php 子类名,php的继承方法获取子类名
看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
php里__CLASS__这类东西是静态绑定的,如果不再子类里重载的话,那么继承父类方法所得到的依旧是父类的名称而不是子类的名称。比如:
class A{
function __construct(){
echo __CLASS__;
}
static function name(){
echo __CLASS__;
}
}
class B extends A{}
此时无论将B实例化还是直接调用静态方法,echo出来的都会是A。翻qeephp里是用子类重载的方式解决这个问题,可是这样的话没新搞一个子类就得把相应调用类名的方法重载一边.....这算是php在oop上的缺陷吧,试了试python上没这个问题。
google之。找到两个函数get_class()和get_called_class()。get_class()用于实例调用,加入参数($this)可解决子类继承调用的问题,而get_called_class()则是用于静态方法调用,可是...这玩意儿只在php 5.3以后才有....5.3还是比较遥远的事...还好5.2之前可以手动实现这个函数:参阅http://php.net/manual/en/function.get-called-class.php 下方有高手添加了几种5.3之前的实现方式。
if(!function_exists('get_called_class')) {
class class_tools
{
private static $i = 0;
private static $fl = null;
public static function get_called_class()
{
$bt = debug_backtrace();
//使用call_user_func或call_user_func_array函数调用类方法,处理如下
if (array_key_exists(3, $bt)
&& array_key_exists('function', $bt[3])
&& in_array($bt[3]['function'], array('call_user_func', 'call_user_func_array'))
) {
//如果参数是数组
if (is_array($bt[3]['args'][0])) {
$toret = $bt[3]['args'][0][0];
return $toret;
}else if(is_string($bt[3]['args'][0])) {//如果参数是字符串
//如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
if(false !== strpos($bt[3]['args'][0], '::')) {
$toret = explode('::', $bt[3]['args'][0]);
return $toret[0];
}
}
}
//使用正常途径调用类方法,如:A::make()
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();
}
}
于是现在可以把例子这么修改:
class A{
function __construct(){
echo get_class($this);
}
static function name(){
echo get_called_class();
}
}
class B extends A{}
这样就能让B直接顺利继承获取当前类名的方法了~
php 子类名,php的继承方法获取子类名相关推荐
- 父页面与子ifream传值,父页面获取子页面document元素与方法
1.父页面获取子ifream中document元素方法 window.document.getElementById('warnIfream').contentWindow.document.getE ...
- js代码 父页面调用子页面中的js方法,子页面调用父页面中的js方法
文中代码亲测可用,转载以示尊重!!! <!--主页面中的JS代码--> <script type="text/javascript"> //调用子页面的方法 ...
- mysql子查询分为几种方法_MYSQL子查询的5种形式
mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当麻烦,mysql子查询的几种常 见写法: 1.select * from xxx where ...
- oracle的子查询分几种方法,oracle 子查询的几个种类
1.where型子查询: select cat_id,good_id,good_name from goods where good_id in (selctmax(good_id)from good ...
- 高级 | Java中获取类名的3种方法
转载自 高级 | Java中获取类名的3种方法 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里面的class的类名表现形式. getCanonical ...
- vue 子页面调用父页面的参数_Flutter子组件调用父组件方法修改父组件参数
子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数.看一下效果图 父级组件实现 在父级组件中写一个_editParentText的方法来修改组件中 ...
- Vue +父组件调用子组件方法 + 子组件回调父组件方法
0. 整体代码: [父组件]: <template><div><span style="color: red">--------------- ...
- js/iframe 子页面调用父页面方法与父页面调用子页方法
博客转载于 https://blog.csdn.net/weixin_44512123/article/details/99698419 在做项目中都会存有主页面子页面.子页面嵌套中主页面中,主页面有 ...
- php获取继承类方法吗,php如何获取当前类名,继承中的问题?
木有标题所说的那么简单!! 问题是 : PHP中 A类继承了B类,如何在A类中获取B类的类名 实际使用状况是: B类是一个基类,多个类A,C,D.....需要继承B类.我想在B类中写一些日志,来记录A ...
最新文章
- libgdx和android界面结合,Android游戏引擎libgdx使用教程5:常用UI类与舞台
- 使用c语言读写netcdf文件,[原][c][netcdf]读取函数
- 攻防世界(Pwn) forgot---栈溢出;(方法一)
- [leetcode] Single Number 查找数组中的单数
- Vue-CLI3.x 高版本覆盖低版本Vue-CLI2.x 解决方法
- 学生渐进片add如何给_渐进片的那些事「5」——验配之前的问诊
- 老调重弹:对kvo的封装思路
- java springlayout_Java SpringLayout
- java更改文件编码方式_java 更改文件编码
- 基于YOLOv7的车辆装载负荷&车牌检测系统(源码&教程)
- 便携计算机硬盘,科技:适用于Mac或PC的最佳便携式外置硬盘
- 主板音频接口连接说明
- IOS 逆向开发(一)密码学 非对称加密RSA
- 程序、任务、进程和线程的联系与区别
- win2003 php配置,Win2003 PHP环境配置
- Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)
- 安全测试中sql注入测试思路
- 软件工程第三次作业 结对编程
- ios备忘录下载安卓版_叮咚~biubiu加速器IOS国服版上线啦
- OrangeUI将支持皮肤包的功能
热门文章
- 数字表达_关于数字、日期及时间的英文表达方式,这里都齐全了
- FPGA自定义UART传输(包含:matlab数据拆分)
- 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,不调用str的strip()方法:
- 生成release版本的Android系统
- CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-1虚拟机安装及环境初始化
- Innodb存储引擎的缓存命中率计算
- centos7防火墙开放端口
- 19道小米运维面试题
- Facebook电商新尝试:看完广告想买马上就可以买
- SqlServer 行转列