zoukankan      html  css  js  c++  java
  • MVC框架入门准备(二)

    语言包类:

    相关配置项
      LANG_FOLDER : 语言包目录名,默认为Lang
      LANG_AUTO : 自动识别语言,默认为true
      DEFAULT_LANG : 默认语言,默认为zh-cn
    方法
      取值 : Lang::get($name)

    eg : Lang::get('PAGE_AUTH_NOT'); // 返回:没有权限访问

      手动加载语言包 : Lang::loadLang($lang)

    eg : Lang::loadLang('zh-cn');

     其他看类和注释:

    <?php
    /**
     * 语言类
     */
    class Lang
    {
        // 语言数据
        protected static $list;
        
        /**
         * 初始化
         */
        public static function init()
        {
            // 默认语言包名
            $default = Config::get('@.DEFAULT_LANG'); //这里任意配置,可以从数据库读,或者从配置中读,都可以
            // 加载默认语言包
            self::$list = self::loadLang($default);
            // 判断是否自动判断浏览器语言
            if (Config::get('@.LANG_AUTO'))
            {
                // 获取浏览器语言
                $lang = self::getlang();
                // 浏览器语言和默认语言不一致就加载覆盖
                if ($default != $lang)
                {
                    self::$list = array_merge(self::$list, self::loadLang($lang)); //最终将语言结果合并到$list变量中
                }
            }
        }
        /**
         * 获取语言
         */
        public static function get($name)
        {
            $args = func_get_args();
            if (!empty($args))
            {
                unset($args[0]);
            }
            if (isset(self::$list[$name]))
            {
                array_unshift($args, self::$list[$name]);
                return call_user_func_array('sprintf', $args);
            }
            else
            {
                return $name;
            }
        }
        
        /**
         * 获取浏览器head头传入的语言名
         *
         * @return boolean
         */
        public static function getlang()
        {
            if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && preg_match('/^([a-zd-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches) > 0)
            {
                return strtolower($matches[1]);
            }
            else
            {
                return false;
            }
        }
        
        /**
         * 载入语言包数据
         *
         * @param string $lang            
         * @return array
         */
        public static function loadLang($lang)
        {
            $list = array ();
            // 框架语言包
            $file = PATH_LANG . $lang . '.lang.php';
            if (is_file($file))
            {
                $data = include $file;
                $list = array_merge($list, $data);
            }
            // 项目语言包
            $file = APP_LANG . $lang . '.lang.php';
            if (is_file($file))
            {
                $data = include $file;
                $list = array_merge($list, $data);
            }
            // 获取模块名
            $m = Dispatch::module();
            // 是否开启模块
            if ('' !== $m)
            {
                // 模块语言包
                $file = APP_MODULE . $m . '/' . Config::get('@.LANG_FOLDER') . '/'. $lang .'.lang.php';
                if (is_file($file))
                {
                    $data = include $file;
                    $list = array_merge($list, $data);
                }
            }
            return $list;
        }
    }

    工厂模式:

    将框架中大部分要创建的对象,都经由驱动类创建,获取,判断。这样做有如下好处:

    1 统一管理所有创建的类,包括创建前处理与创建后处理

    2 单一创建,防止多次创建类

    实例:

    复制代码
    <?php
    /**
     *驱动类 - 工厂模式
     */
    abstract class Driver  //抽象类
    {
        // 配置数组
        protected static $configs = array ();
        // 实例数组
        protected static $instance = array ();
        public static function init()
        {
         ........//初始化处理,可以加载类的base基类等其他操作 $driver = get_called_class(); //获取调用的类名 $className = $driver . 'Base'; if (! class_exists($className, false)) { ........ } } /** * 创建驱动实例 * * @param string $name * @param string $alias * @param array $args * @return mixed */ public static function create($name, $alias = '') { $name = ucfirst($name); $driver = get_called_class(); //获取调用的类名 // 类名 $className = $driver . $name; // 是否存在该类实例 if (isset(self::$instance[$driver][$alias])) { return self::$instance[$driver][$alias]; //防止多次创建 } else { // 驱动路径 $fileName = "{$driver}/{$className}.class.php"; // 引入驱动文件 if (require_once $fileName) { // 实例化 $ref = new ReflectionClass($className); //反射类 $args = array_slice(func_get_args(), 2); //参数隔离 self::$instance[$driver][$alias] = $ref->newInstanceArgs($args); //反射类实例化,同时这里会调用实例化类的构造方法,并传递参数 self::$configs[$driver][] = $className; } else { // 引入驱动失败 return false; } // 返回实例 return self::$instance[$driver][$alias]; } } /** * 获得驱动实例,不存在返回null * * @param type $name * @return mixed */ public static function getObj($name='') { static $driver; // 第一次获取当前驱动名 if (null === $driver) { $driver = get_called_class(); } if (isset(self::$instance[$driver][$name])) { return self::$instance[$driver][$name]; } else { return null; } } public static function exists($name) { static $driver; // 第一次获取当前驱动名 if (null === $driver) { $driver = get_called_class(); } return isset(self::$instance[$driver][$name]); } /** * 获取驱动实例数量 * * @return int */ public static function length($name) { return count(self::$configs[$name]); } }
    复制代码

    此处用了反射类

    创建的时候用:

     Db::create($option['type'], $name, $option);

    获取对象实例:

    $obj = self::getObj($name);
  • 相关阅读:
    weblogic中server的启动
    oracle connect by
    DBA常用的一些视图和sql
    查询分类并实现分类统计SQL存储过程
    从一组数据中寻找第K大的数
    一个关于StringBuilder延伸类
    总结.net的技术特性
    C#Reflection学习记录
    Asp.net 安全补丁发布
    比较无聊的while与for的较量。
  • 原文地址:https://www.cnblogs.com/zhenghongxin/p/6846682.html
Copyright © 2011-2022 走看看