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[]);
}
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-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches) > )
{
return strtolower($matches[]);
}
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);
MVC框架入门准备(二) - 语言包类与工厂模式的更多相关文章
- 自己写一个java的mvc框架吧(二)
自己写一个mvc框架吧(二) 自己写代码的习惯 写一个框架吧,如果这个框架会用到一些配置上的东西,我自己习惯是先不用考虑这个配置文件应该是怎样的,什么形式的,先用一个java对象(比如叫 Config ...
- spring mvc框架入门
目录 1.web框架分层 2.什么是springmvc 3.springmvc的优势 4.springmvc和struct的区别 (spring mvc框架入门 1.web框架分层 一般web框架可以 ...
- 派生类&简单工厂模式
派生类&简单工厂模式 git链接: Operation3.1.1 题目描述的代码部分的解释 首先是声明一个Rand类作为父类,然后两个子类RandNumber类和RandOperation类, ...
- MVC框架入门准备(三)事件类 - 事件的监听和触发
在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...
- spring MVC框架入门(外加SSM整合)
spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...
- Android设计模式(十二)--抽象工厂模式
问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...
- JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式
/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person(&qu ...
- java ssm框架入门(二)添加语言滤器
使用过滤器是在web.xml中使用filter,以下是码过滤器,过滤所有资源的使用 web.xml <filter> <filter-name>setCharactor< ...
- MyBatis框架入门之(二)
在本篇文章中,没有对细节进行处理的很好,有很多晓得细节的遗漏,本文只是一个简单的快速的入门 MyBatis的快速入门 导入MyBatis框架jar包 配置文件 SqlSessionFactoryBui ...
随机推荐
- Rhythmk 一步一步学 JAVA (20) JAVA enum常用方法
JAVA 枚举定义常用方法: 1.static Enum valueOf(Class enum,String name) 返回指定name的枚举类型 2.Static Enum values[] 返回 ...
- Firemonkey MultiView
MultiView 做导航用的. http://docwiki.embarcadero.com/RADStudio/Seattle/en/Mobile_Tutorial:_Using_a_MultiV ...
- 利用MemoryAnalyzer进行OutOfMemoryError的诊断分析
这篇帖子只介绍利用MemoryAnalyzer进行简单的JVM的堆的分析,至于JVM的内部结构是怎么样的,这里不进行分析.好吧,废话不多说:首先如果我们要分析JVM某个时刻的Heap的对象分配情况,我 ...
- numpy中的ndarray方法和属性
原文地址 NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是 ...
- java中回调函数的使用
package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; /** * 回调函数 * @aut ...
- idea提示,格式化代码,清除不使用的包快捷键,maven自动导jar包
一.提示快捷键 idea默认快捷键是ctrl+space,通常和别的软件快捷键冲突,所以将快捷键修改为alt+/ 二.格式化快捷键ctrl+alt+l,通常和qq.tim快捷键冲突,请修改qq或者ti ...
- Mybatis框架的输出映射类型
Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. resultType(输出类型) 1.输出简单类型 (1)我们在UserM ...
- 解压*.tar.bz2的坑
下了一个压缩包,tar -xf 解压不了 解决办法: 装了bzip2工具 bzip2 -d **.tar.bz2 //将文件解压成**.tar tar -xf **.tar //解包 听说可以 tar ...
- MVC5数据库迁移命令!
首先数据库迁移在上下文里设置要设置成为CreateDatabaseIfNotExists, 然后在Nuget控制平台输入命令 在“程序包管理器控制台”窗口中输入:Enable-Migrations ...
- C语言基础第一次作业
一,1)大学和高中最大的不同是没有人天天看着你,请问大学理想的师生关系是?有何感想? 看了邹欣老师博客中写到的教学基础——师生关系后陷入沉思,邹欣老师在她的博客中直接否认了传统认知的师生关系——蜡烛, ...