语言包类:
相关配置项
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);