静态延迟绑定php_called_class 在php 5.2中的另类实现

今天项目重构部分的代码看到同事用到了一个函数get_called_class,开始发为他自己封装的函数,可是查了下他并没有实现这个方法,便下意识的到手册里查了下,可是还是没有,就感觉很奇怪。

百度了下才发现,原来这个是PHP5.3中引进的一个新的延时绑定的方法,在PHP5.2中不能够得到继续树的类名,在PHP5.3中得到了改进,但是我们的项目当前的部署都是5.2,于是找了个另类方法,但是不会在正式项目中使用。

if(!function_exists('get_called_class')) {
    class class_tools {
        static $i = 0;
        static $fl = null;
 
        static function get_called_class() {
            $bt = debug_backtrace();
 
            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();
    }
}

只是网上找来参考下

发表评论

电子邮件地址不会被公开。 必填项已用*标注