语言包类:

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

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

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

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

其他看类和注释:

  1. <?php
  2. /**
  3. * 语言类
  4. */
  5. class Lang
  6. {
  7. // 语言数据
  8. protected static $list;
  9.  
  10. /**
  11. * 初始化
  12. */
  13. public static function init()
  14. {
  15. // 默认语言包名
  16. $default = Config::get('@.DEFAULT_LANG'); //这里任意配置,可以从数据库读,或者从配置中读,都可以
  17. // 加载默认语言包
  18. self::$list = self::loadLang($default);
  19. // 判断是否自动判断浏览器语言
  20. if (Config::get('@.LANG_AUTO'))
  21. {
  22. // 获取浏览器语言
  23. $lang = self::getlang();
  24. // 浏览器语言和默认语言不一致就加载覆盖
  25. if ($default != $lang)
  26. {
  27. self::$list = array_merge(self::$list, self::loadLang($lang)); //最终将语言结果合并到$list变量中
  28. }
  29. }
  30. }
  31. /**
  32. * 获取语言
  33. */
  34. public static function get($name)
  35. {
  36. $args = func_get_args();
  37. if (!empty($args))
  38. {
  39. unset($args[]);
  40. }
  41. if (isset(self::$list[$name]))
  42. {
  43. array_unshift($args, self::$list[$name]);
  44. return call_user_func_array('sprintf', $args);
  45. }
  46. else
  47. {
  48. return $name;
  49. }
  50. }
  51.  
  52. /**
  53. * 获取浏览器head头传入的语言名
  54. *
  55. * @return boolean
  56. */
  57. public static function getlang()
  58. {
  59. if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches) > )
  60. {
  61. return strtolower($matches[]);
  62. }
  63. else
  64. {
  65. return false;
  66. }
  67. }
  68.  
  69. /**
  70. * 载入语言包数据
  71. *
  72. * @param string $lang
  73. * @return array
  74. */
  75. public static function loadLang($lang)
  76. {
  77. $list = array ();
  78. // 框架语言包
  79. $file = PATH_LANG . $lang . '.lang.php';
  80. if (is_file($file))
  81. {
  82. $data = include $file;
  83. $list = array_merge($list, $data);
  84. }
  85. // 项目语言包
  86. $file = APP_LANG . $lang . '.lang.php';
  87. if (is_file($file))
  88. {
  89. $data = include $file;
  90. $list = array_merge($list, $data);
  91. }
  92. // 获取模块名
  93. $m = Dispatch::module();
  94. // 是否开启模块
  95. if ('' !== $m)
  96. {
  97. // 模块语言包
  98. $file = APP_MODULE . $m . '/' . Config::get('@.LANG_FOLDER') . '/'. $lang .'.lang.php';
  99. if (is_file($file))
  100. {
  101. $data = include $file;
  102. $list = array_merge($list, $data);
  103. }
  104. }
  105. return $list;
  106. }
  107. }

工厂模式:

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

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

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

实例:

  1. <?php
  2. /**
  3. *驱动类 - 工厂模式
  4. */
  5. abstract class Driver //抽象类
  6. {
  7. // 配置数组
  8. protected static $configs = array ();
  9. // 实例数组
  10. protected static $instance = array ();
  11. public static function init()
  12. {
         ........//初始化处理,可以加载类的base基类等其他操作
  13. $driver = get_called_class(); //获取调用的类名
  14. $className = $driver . 'Base';
  15. if (! class_exists($className, false))
  16. {
  17. ........
  18. }
  19. }
  20. /**
  21. * 创建驱动实例
  22. *
  23. * @param string $name
  24. * @param string $alias
  25. * @param array $args
  26. * @return mixed
  27. */
  28. public static function create($name, $alias = '')
  29. {
  30. $name = ucfirst($name);
  31. $driver = get_called_class(); //获取调用的类名
  32. // 类名
  33. $className = $driver . $name;
  34. // 是否存在该类实例
  35. if (isset(self::$instance[$driver][$alias]))
  36. {
  37. return self::$instance[$driver][$alias]; //防止多次创建
  38. }
  39. else
  40. {
  41. // 驱动路径
  42. $fileName = "{$driver}/{$className}.class.php";
  43. // 引入驱动文件
  44. if (require_once $fileName)
  45. {
  46. // 实例化
  47. $ref = new ReflectionClass($className); //反射类
  48. $args = array_slice(func_get_args(), 2); //参数隔离
  49. self::$instance[$driver][$alias] = $ref->newInstanceArgs($args); //反射类实例化,同时这里会调用实例化类的构造方法,并传递参数
  50. self::$configs[$driver][] = $className;
  51. }
  52. else
  53. {
  54. // 引入驱动失败
  55. return false;
  56. }
  57. // 返回实例
  58. return self::$instance[$driver][$alias];
  59. }
  60. }
  61. /**
  62. * 获得驱动实例,不存在返回null
  63. *
  64. * @param type $name
  65. * @return mixed
  66. */
  67. public static function getObj($name='')
  68. {
  69. static $driver;
  70. // 第一次获取当前驱动名
  71. if (null === $driver)
  72. {
  73. $driver = get_called_class();
  74. }
  75. if (isset(self::$instance[$driver][$name]))
  76. {
  77. return self::$instance[$driver][$name];
  78. }
  79. else
  80. {
  81. return null;
  82. }
  83. }
  84. public static function exists($name)
  85. {
  86. static $driver;
  87. // 第一次获取当前驱动名
  88. if (null === $driver)
  89. {
  90. $driver = get_called_class();
  91. }
  92. return isset(self::$instance[$driver][$name]);
  93. }
  94.  
  95. /**
  96. * 获取驱动实例数量
  97. *
  98. * @return int
  99. */
  100. public static function length($name)
  101. {
  102. return count(self::$configs[$name]);
  103. }
  104. }

此处用了反射类

创建的时候用:

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

获取对象实例:

  1. $obj = self::getObj($name);

MVC框架入门准备(二) - 语言包类与工厂模式的更多相关文章

  1. 自己写一个java的mvc框架吧(二)

    自己写一个mvc框架吧(二) 自己写代码的习惯 写一个框架吧,如果这个框架会用到一些配置上的东西,我自己习惯是先不用考虑这个配置文件应该是怎样的,什么形式的,先用一个java对象(比如叫 Config ...

  2. spring mvc框架入门

    目录 1.web框架分层 2.什么是springmvc 3.springmvc的优势 4.springmvc和struct的区别 (spring mvc框架入门 1.web框架分层 一般web框架可以 ...

  3. 派生类&简单工厂模式

    派生类&简单工厂模式 git链接: Operation3.1.1 题目描述的代码部分的解释 首先是声明一个Rand类作为父类,然后两个子类RandNumber类和RandOperation类, ...

  4. MVC框架入门准备(三)事件类 - 事件的监听和触发

    在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...

  5. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...

  6. Android设计模式(十二)--抽象工厂模式

    问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...

  7. JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

    /** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...

  8. java ssm框架入门(二)添加语言滤器

    使用过滤器是在web.xml中使用filter,以下是码过滤器,过滤所有资源的使用 web.xml <filter> <filter-name>setCharactor< ...

  9. MyBatis框架入门之(二)

    在本篇文章中,没有对细节进行处理的很好,有很多晓得细节的遗漏,本文只是一个简单的快速的入门 MyBatis的快速入门 导入MyBatis框架jar包 配置文件 SqlSessionFactoryBui ...

随机推荐

  1. Kafka学习总结

    Kafka学习总结 参考资料: 1.http://kafka.apachecn.org/, kafka官方文档 2.https://www.cnblogs.com/likehua/p/3999538. ...

  2. java中回调函数的使用

    package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; /** * 回调函数 * @aut ...

  3. AABB和平面的相交性检测

    [AABB和平面的相交性检测]

  4. 浅探SpringMVC中HandlerExecutionChain之handler、interceptor

    讲解HandlerExecutionChain之前,先大致了解下SpringMVC的核心开发步骤: 在web.xml中部署DispaterServlet,并配置springmvc.xml等文件; 将映 ...

  5. ssh 连接很慢的解决办法

    http://blog.csdn.net/ablo_zhou/article/details/5074887 ============= 现象: 在局域网内,能ping通目标机器,并且时延是微秒级. ...

  6. DSOFramer 控件修改成功

    1.Html电子印章.手写签名系统演示:http://www.dianju.com.cn/video.htm 在线试用: http://www.dianju.com.cn/websignpiaoju/ ...

  7. USB相关注册表

    计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{ SYSTEM\\CurrentControlSet\\Control\\ ...

  8. 给tabhost加上点击监听,不是onTabChanged(String)监听

    给tabhost加上点击监听,不是onTabChanged(String)监听 2012-08-11 01:43 5209人阅读 评论(0) 收藏 举报 stringandroidlayoutnull ...

  9. 打开Android Studio时报Unable to access Android SDK add-on list

    第一次安装Android studio时候弹出unable to access android sdk add-on list原因是你电脑没有SDK而且你下载的android studio又是不带SD ...

  10. 使用windows server2012时FileZilla客户端连接时报150 Opening data channel for directory listing of "/" 响应:425 Can't open data connection

    425 Can't open data connection 和 读取目录列表失败 问题解决 这个问题主要是由于使用Passive Mode模式造成的,解决这个问题很简单: 1.在ftp服务软件中设置 ...