让PHP<5.3版本支持get_called_class()方法

//PHP<5.3版本支持get_called_class()方法
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];
        }

    }
    /**
     * 获取当前调用所在的类名,用于静态成员方法中
     * @return string
     */
    function get_called_class() {
        return class_tools::get_called_class();
    }

}
posted @ 2012-09-28 00:41  XBOY2012  阅读(598)  评论(0编辑  收藏  举报