首页 > 其他分享 >MVC框架入门准备(二) - 语言包类与工厂模式

MVC框架入门准备(二) - 语言包类与工厂模式

时间:2022-11-30 12:39:09浏览次数:36  
标签:return 入门 list self driver MVC 语言包 static name

语言包类:

相关配置项
  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-z\d\-]+)/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);

 

源码面前,了无秘密



标签:return,入门,list,self,driver,MVC,语言包,static,name
From: https://blog.51cto.com/zhenghongxin/5898224

相关文章

  • MVC框架入门准备(一)
    最近开发一套自己的框架,开发了一个多月,已传到git,学到了挺多,系列文章我会慢慢写挺多这里先讲大致框架多用到的某些函数,我这里先列举一部分,网上对函数的定义,参数说明等,我就不......
  • Thinkphp入门 四 —布局、缓存、系统变量 (48)
    【控制器操作方法参数设置】​​http://网址/index.php/控制器/操作方法​​  【页面跳转】【变量调节器】Smarty变量调节器TP变量调节器:普通的php函数(count strlen ......
  • JavaScript入门①-基础知识筑基
    01、JavaScript基础知识JavaScript(缩写:JS)是一种具有面向对象能力的、解释型的程序语言,基于对象和事件驱动,具有相对安全性的客户端脚本语言。JavaScript是一门完备的动态......
  • CTF入门第二课
    php,sql注入类型考点php弱类型理解==和===的区别MD5验证绕过方法    这里要注意一点就是看前面的数字是不是1如果是则后面的==为true;反之!三个等......
  • CTF入门第一课
    初入CTF的小白首先,明确一个问题:CTF是用来干什么的呢?解题模式,解决网络技术安全挑战(即找flag),提交后获得相应分值攻防赛模式:你去攻人家,人家也会来攻击你,你必须学会自保,同......
  • 视图 触发器 事务 MVCC 存储过程 MySQL函数 MySQL流程控制 索引的数据结构 索引失效
    目录视图createview...as触发器简介创建触发器的语法createtrigger触发器命名有一定的规律临时修改SQL语句的结束符delimiter触发器的实际运用触发器补充方法show......
  • SQL注入问题、视图、触发器、事务、隔离级别、MVCC多版本控制、存储过程、函数、流程
    目录SQL注入问题视图触发器创建触发器语法触发器的命名触发器实际应用事务如何使用事务隔离级别MVCC多版本控制存储过程函数流程控制索引相关概念索引数据结构慢查询优化S......
  • Doris入门
    什么是Doris?ApacheDoris是一个基于MPP(大规模并行处理)架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询......
  • Dagger2利器系列一:入门到使用
    商业转载请联系作者获得授权,非商业转载请注明出处。目录​​一 Dagger2​​​​1.1简介:​​​​1.2起源​​​​二Dagger2注解初识​​​​2.1@Inject:​​​​2.2@Mod......
  • 安卓设计模式演变之经典三层模型(MVC/MVP/MVVM)
    转载请标明出处!先看代码demo再回看文章效果最佳!目录​​一mvc​​​​1.1概述​​​​1.2 作用流程​​​​1.3 现状​​​​1.4致命弱点/缺点:​​​​1.5 代码Demo​......