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);
原文地址:https://www.cnblogs.com/zhenghongxin/p/6846682.html