找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3073|回复: 1

[教程] php的继承方法获取子类名

[复制链接]
发表于 2013-4-15 09:17:35 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江
  1. 看了一下datastore的入门,以及开始采用MVC方式来写php,于是想拿php为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.-
  2. php里__CLASS__这类东西是静态绑定的,如果不再子类里重载的话,那么继承父类方法所得到的依旧是父类的名称而不是子类的名称。比如:
  3. class A{
  4. function __construct(){
  5. echo __CLASS__;
  6. }
  7. static function name(){
  8. echo __CLASS__;
  9. }
  10. }
  11. class B extends A{}
  12. 此时无论将B实例化还是直接调用静态方法,echo出来的都会是A。翻qeephp里是用子类重载的方式解决这个问题,可是这样的话没新搞一个子类就得把相应调用类名的方法重载一边.....这算是php在oop上的缺陷吧,试了试python上没这个问题。
  13. 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之前的实现方式。
  14. if(!function_exists('get_called_class')) {
  15. class class_tools
  16. {
  17. private static $i = 0;
  18. private static $fl = null;
  19. public static function get_called_class()
  20. {
  21. $bt = debug_backtrace();
  22. //使用call_user_func或call_user_func_array函数调用类方法,处理如下
  23. if (array_key_exists(3, $bt)
  24. && array_key_exists('function', $bt[3])
  25. && in_array($bt[3]['function'], array('call_user_func', 'call_user_func_array'))
  26. ) {
  27. //如果参数是数组
  28. if (is_array($bt[3]['args'][0])) {
  29. $toret = $bt[3]['args'][0][0];
  30. return $toret;
  31. }else if(is_string($bt[3]['args'][0])) {//如果参数是字符串
  32. //如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
  33. if(false !== strpos($bt[3]['args'][0], '::')) {
  34. $toret = explode('::', $bt[3]['args'][0]);
  35. return $toret[0];
  36. }
  37. }
  38. }
  39. //使用正常途径调用类方法,如:A::make()
  40. if(self::$fl == $bt[2]['file'].$bt[2]['line']) {
  41. self::$i++;
  42. } else {
  43. self::$i = 0;
  44. self::$fl = $bt[2]['file'].$bt[2]['line'];
  45. }
  46. $lines = file($bt[2]['file']);
  47. preg_match_all('
  48. /([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
  49. $lines[$bt[2]['line']-1],
  50. $matches
  51. );
  52. return $matches[1][self::$i];
  53. }
  54. }
  55. function get_called_class()
  56. {
  57. return class_tools::get_called_class();
  58. }
  59. }
  60. 于是现在可以把例子这么修改:
  61. class A{
  62. function __construct(){
  63. echo get_class($this);
  64. }
  65. static function name(){
  66. echo get_called_class();
  67. }
  68. }
  69. class B extends A{}
  70. 这样就能让B直接顺利继承获取当前类名的方法了~
复制代码

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2013-4-15 11:45:47 | 显示全部楼层 来自 中国–北京–北京
个人觉得还是不要把代码和文字混到一块的好

评分

参与人数 1金币 +5 收起 理由
抢楼评分专号 + 5 很幸运,你获得了抢楼奖励!

查看全部评分

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-11-22 10:04 , Processed in 0.043174 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表