1、ThinkPHP 单字母函数A() 内部实例化控制器D() 实例化自定义模型类M() 实 例 化 一 个 基 础 模 型 类R() 调 用 某 个 控 制 器 的 操 作 方 法L() 启 用 多 语 言 的 情 况 下 , 设 置 和 获 取 当 前 的 语 言 定 义N() 计 数 器 方 法G() 包 括 标 记 位 置 和 区 间 统 计 两 个 功 能F() 用 于 简 单 数 据 缓 存 , 并 且 只 能 支 持 文 件 形 式C() 用 于 设 置 、 获 取 , 以 及 保 存 配 置 参 数方法详解:A方法用于在内部实例化控制器,调用格式:A(项目 :/分组 /模块 ,控制
2、器层名称 )最简单的用法:$USER = A(USER);表示实例化当前项目的 UserAction控制器(这个控制器对应的文件位于Lib/Action/UserAction.class.php) ,如果采用了分组模式,并且要实例化另外一个Admin分组的控制器可以用:$USER = A(ADMIN/USER);也支持跨项目实例化(项目的目录要保持同级)$USER = A(ADMIN:/USER);表示实例化 Admin项目下面的 UserAction控制器3.1版本增加了分层控制器的支持,所以还可以用 A方法实例化其他的控制器,例如:$USER = A(USER,EVENT);实例化 Use
3、rEvent控制器(对应的文件位于 Lib/Event/UserEvent.class.php) 。实例化控制器后,就可以调用该控制器中的方法,不过需要注意的情况是,在跨项目调用的情况下,如果你的操作方法 有针对当前控制器的特殊变量操作,会有一些未知的问题,所以,一般来说,官方建议需要公共调用的控制器层单独开发,不要有太多的依赖关系。D方法应该是用的比较多的方法了,用于实例化自定义模型类,是 ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D(项目:/分组/模型,模型层名称)方法的返回值是实例化的模型对象。D方法可以自动检测模型类,如果
4、存在自定义的模型类,则实例化自定义模型类,如果不存在,则会实例化 Model基类,同时对于已实例化过的模型,不会重复去实例化。D方法最常用的用法就是实例化当前项目的某个自定义模型,例如:/ 实 例 化 USER 模 型$USER = D(USER);会导入当前项目下面的 Lib/Model/UserModel.class.php文件,然后实例化 UserModel类,所以,实际上的代码可能和下面的等效:IMPORT(.MODEL.USERMODEL);$USER = NEW USERMODEL();但是如果使用 D方法的话,如果这个 UserModel类不存在,则会自动调用NEW MODEL(
5、USER);并且第二次调用的时候无需再次实例化,可以减少一定的对象实例化开销。D方法可以支持跨分组和项目实例化模型,例如:/实 例 化 ADMIN 项 目 的 USER 模 型D(ADMIN:/USER)/实 例 化 ADMIN 分 组 的 USER 模 型D(ADMIN/USER)注意:要实现跨项目调用模型的话,必须确保两个项目的目录结构是并列的。3.1版本开始,由于增加了分层模型的支持,所以 D方法也可以实例化其他的模型,例如:/ 实 例 化 USERSERVICE 类$USER = D(USER,SERVICE);/ 实 例 化 USERLOGIC 类$USER = D(USER,LOG
6、IC);D(USER,SERVICE);会导入 Lib/Service/UserService.class.php,并实例化,等效于下面的代码:IMPORT(.SERVICE.USERSERVICE);$USER = NEW USERSERIVCE();M方法用 于 实 例 化 一 个 基 础 模 型 类 , 和 D方 法 的 区 别 在 于 :1、 不 需 要 自 定 义 模 型 类 , 减 少 IO加 载 , 性 能 较 好 ;2、 实 例 化 后 只 能 调 用 基 础 模 型 类 ( 默 认 是 MODEL类 ) 中 的 方 法 ;3、 可 以 在 实 例 化 的 时 候 指 定 表
7、前 缀 、 数 据 库 和 数 据 库 的 连 接 信 息 ;D方 法 的 强 大 则 体 现 在 你 封 装 的 自 定 义 模 型 类 有 多 强 , 不 过 随 着 新 版 THINKPHP框 架的 基 础 模 型 类 的 功 能 越 来 越 强 大 , M方 法 也 比 D方 法 越 来 越 实 用 了 。M方 法 的 调 用 格 式 :M(基 础 模 型 名 :模 型 名 ,数 据 表 前 缀 ,数 据 库 连 接 信 息 )我 们 来 看 下 M方 法 具 体 有 哪 些 用 法 :1、 实 例 化 基 础 模 型 ( MODEL) 类在 没 有 定 义 任 何 模 型 的 时 候
8、 , 我 们 可 以 使 用 下 面 的 方 法 实 例 化 一 个 模 型 类 来 进 行 操 作 :/实 例 化 USER模 型$USER = M(USER);/执 行 其 他 的 数 据 操 作$USER-SELECT();这 种 方 法 最 简 单 高 效 , 因 为 不 需 要 定 义 任 何 的 模 型 类 , 所 以 支 持 跨 项 目 调 用 。 缺 点 也 是因 为 没 有 自 定 义 的 模 型 类 , 因 此 无 法 写 入 相 关 的 业 务 逻 辑 , 只 能 完 成 基 本 的 CURD操作 。$USER = M(USER);其 实 等 效 于 :$USER = N
9、EW MODEL(USER);表 示 操 作 THINK_USER表 。 M方 法 和 D方 法 一 样 也 有 单 例 功 能 , 多 次 调 用 并 不 会 重 复 实例 化 。 M方 法 的 模 型 名 参 数 在 转 换 成 数 据 表 的 时 候 会 自 动 转 换 成 小 写 , 也 就 是 说THINKPHP的 数 据 表 命 名 规 范 是 全 小 写 的 格 式 。2、 实 例 化 其 他 公 共 模 型 类第 一 种 方 式 实 例 化 因 为 没 有 模 型 类 的 定 义 , 因 此 很 难 封 装 一 些 额 外 的 逻 辑 方 法 , 不 过 大多 数 情 况 下
10、, 也 许 只 是 需 要 扩 展 一 些 通 用 的 逻 辑 , 那 么 就 可 以 尝 试 下 面 一 种 方 法 。$USER = M(COMMONMODEL:USER);改 用 法 其 实 等 效 于 :$USER = NEW COMMONMODEL(USER);因 为 系 统 的 模 型 类 都 能 够 自 动 加 载 , 因 此 我 们 不 需 要 在 实 例 化 之 前 手 动 进 行 类 库 导 入 操作 。 模 型 类 COMMONMODEL必 须 继 承 MODEL。 我 们 可 以 在 COMMONMODEL类 里 面 定义 一 些 通 用 的 逻 辑 方 法 , 就 可
11、 以 省 去 为 每 个 数 据 表 定 义 具 体 的 模 型 类 , 如 果 你 的 项 目 已经 有 超 过 100个 数 据 表 了 , 而 大 多 数 情 况 都 是 一 些 基 本 的 CURD操 作 的 话 , 只 是 个 别模 型 有 一 些 复 杂 的 业 务 逻 辑 需 要 封 装 , 那 么 第 一 种 方 式 和 第 二 种 方 式 的 结 合 是 一 个 不 错的 选 择 。3、 传 入 表 前 缀 、 数 据 库 和 其 他 信 息M方 法 有 三 个 参 数 , 第 一 个 参 数 是 模 型 名 称 ( 可 以 包 括 基 础 模 型 类 和 数 据 库 ) ,
12、 第 二 个参 数 用 于 设 置 数 据 表 的 前 缀 ( 留 空 则 取 当 前 项 目 配 置 的 表 前 缀 ) , 第 三 个 参 数 用 于 设 置当 前 使 用 的 数 据 库 连 接 信 息 ( 留 空 则 取 当 前 项 目 配 置 的 数 据 库 连 接 信 息 ) , 例 如 :$USER = M(DB2.USER,THINK_);表 示 实 例 化 MODEL模 型 类 , 并 操 作 DB2数 据 库 中 的 THINK_USER表 。如 果 第 二 个 参 数 留 空 或 者 不 传 , 表 示 使 用 当 前 项 目 配 置 中 的 数 据 表 前 缀 , 如
13、果 操 作 的 数据 表 没 有 表 前 缀 , 那 么 可 以 使 用 :$USER = M(DB1.USER,NULL);表 示 实 例 化 MODEL模 型 类 , 并 操 作 DB1数 据 库 中 的 USER表 。如 果 你 操 作 的 数 据 库 需 要 不 同 的 用 户 账 号 , 可 以 传 入 数 据 库 的 连 接 信 息 , 例 如 :$USER = M(USER,THINK_,MYSQL:/USER_A:1234LOCALHOST:3306/THINKPHP);表 示 基 础 模 型 类 用 MODEL, 然 后 对 THINK_USER表 进 行 操 作 , 用 U
14、SER_A账 号 进 行 数 据库 连 接 , 操 作 数 据 库 是 THINKPHP。第 三 个 连 接 信 息 参 数 可 以 使 用 DSN配 置 或 者 数 组 配 置 , 甚 至 可 以 支 持 配 置 参 数 。例 如 , 在 项 目 配 置 文 件 中 配 置 了 :DB_CONFIG=MYSQL:/USER_A:1234LOCALHOST:3306/THINKPHP;则 可 以 使 用 :$USER = M(USER,THINK_,DB_CONFIG);基 础 模 型 类 和 数 据 库 可 以 一 起 使 用 , 例 如 :$USER = M(COMMONMODEL:DB2
15、.USER,THINK_);如 果 要 实 例 化 分 层 模 型 的 话 , 利 用 公 共 模 型 类 的 方 式 , 我 们 可 以 使 用 :M(USERLOGIC:USER);来 实 例 化 USERLOGIC, 虽 然 这 样 做 的 意 义 不 大 , 因 为 可 以 用D(USER,LOGIC);实 现 同 样 的 功 能 。R方法用 于 调 用 某 个 控 制 器 的 操 作 方 法 , 是 A方 法 的 进 一 步 增 强 和 补 充 。R方 法 的 调 用 格 式 :R(项 目 :/分 组 /模 块 /操 作 ,参 数 ,控 制 器 层 名 称 ) 例 如 , 我 们 定
16、 义 了 一 个 操 作 方 法 为 :1. CLASS USERACTION EXTENDS ACTION 2. PUBLIC FUNCTION DETAIL($ID)3. RETURN M(USER)-FIND($ID);4. 5. 那 么 就 可 以 通 过 R方 法 在 其 他 控 制 器 里 面 调 用 这 个 操 作 方 法 ( 一 般 R方 法 用 于 跨 模 块调 用 )1. $DATA = R(USER/DETAIL,ARRAY(5);表 示 调 用 USER控 制 器 的 DETAIL方 法 ( DETAIL方 法 必 须 是 PUBLIC类 型 ) , 返 回 值 就 是
17、 查询 ID为 5的 一 个 用 户 数 据 。 如 果 你 要 调 用 的 操 作 方 法 是 没 有 任 何 参 数 的 话 , 第 二 个 参 数则 可 以 留 空 , 直 接 使 用 :1. $DATA = R(USER/DETAIL);也 可 以 支 持 跨 分 组 和 项 目 调 用 , 例 如 :1. R(ADMIN/USER/DETAIL,ARRAY(5);表 示 调 用 ADMIN分 组 下 面 的 USER控 制 器 的 DETAIL方 法 。1. R(ADMIN:/USER/DETAIL,ARRAY(5);表 示 调 用 ADMIN项 目 下 面 的 USER控 制 器
18、的 DETAIL方 法 。官 方 的 建 议 是 不 要 在 同 一 层 多 太 多 调 用 , 会 引 起 逻 辑 的 混 乱 , 被 公 共 调 用 的 部 分 应 该 封装 成 单 独 的 接 口 , 可 以 借 助 3.1的 新 特 性 多 层 控 制 器 , 单 独 添 加 一 个 控 制 器 层 用 于 接 口调 用 , 例 如 , 我 们 增 加 一 个 API控 制 器 层 ,1. CLASS USERAPI EXTENDS ACTION 2. PUBLIC FUNCTION DETAIL($ID)3. RETURN M(USER)-FIND($ID);4. 5. 然 后 ,
19、使 用 R方 法 调 用1. $DATA = R(USER/DETAIL,ARRAY(5),API);也 就 是 说 , R方 法 的 第 三 个 参 数 支 持 指 定 调 用 的 控 制 器 层 。同 时 , R方 法 调 用 操 作 方 法 的 时 候 可 以 支 持 操 作 后 缀 设 置 C(ACTION_SUFFIX), 如 果你 设 置 了 操 作 方 法 后 缀 , 仍 然 不 需 要 更 改 R方 法 的 调 用 方 式 。L方法用 于 启 用 多 语 言 的 情 况 下 , 设 置 和 获 取 当 前 的 语 言 定 义 。调 用 格 式 : L(语 言 变 量 ,语 言
20、值 )设 置 语 言 变 量除 了 使 用 语 言 包 定 义 语 言 变 量 之 外 , 我 们 可 以 用 L方 法 动 态 设 置 语 言 变 量 , 例 如 :L(LANG_VAR,语 言 定 义 );语 言 定 义 不 区 分 大 小 写 , 所 以 下 面 也 是 等 效 的 :L(LANG_VAR,语 言 定 义 );不 过 规 范 起 见 , 我 们 建 议 统 一 采 用 大 写 定 义 语 言 变 量 。L方 法 支 持 批 量 设 置 语 言 变 量 , 例 如 :$LANGLANG_VAR1 = 语 言 定 义 1;$LANGLANG_VAR2 = 语 言 定 义 2;
21、$LANGLANG_VAR3 = 语 言 定 义 3;L($LANG);表 示 同 时 设 置 3个 语 言 变 量 LANG_VAR1 LANG_VAR2和 LANG_VAR3。-MORE-获 取 语 言 变 量$LANGVAR = L(LANG_VAR);或 者 :$LANGVAR = L(LANG_VAR);如 果 参 数 为 空 , 表 示 获 取 当 前 定 义 的 全 部 语 言 变 量 ( 包 括 语 言 定 义 文 件 中 的 ) :$LANG = L();或 者 我 们 也 可 以 在 模 板 中 使 用$THINK.LANG.LANG_VAR来 输 出 语 言 定 义 。N
22、方法属 于 计 数 器 方 法 , 被 用 于 核 心 的 查 询 、 缓 存 统 计 的 计 数 和 统 计 。 但 是 其 实 可 以用 于 应 用 的 其 他 计 数 用 途 , 用 法 比 较 简 单 , 调 用 格 式 :N(计 数 位 置 ,步 进 值 )例 如 , 我 们 要 统 计 页 面 中 的 查 询 次 数 , 可 以 用1. N(READ,1);表 示 每 次 执 行 到 该 位 置 都 会 引 起 计 数 器 加 1, 到 页 面 结 束 之 前 , 我 们 就 可 以 用1. $COUNT = N(READ);来 统 计 当 前 页 面 执 行 的 查 询 数 目
23、。如 果 你 希 望 计 数 器 每 次 增 加 5, 那 么 可 以 改 变 步 进 值 , 例 如 :1. N(SCORE,5);需 要 注 意 的 是 , N方 法 页 面 执 行 完 毕 后 的 统 计 结 果 不 会 带 入 下 次 统 计 。G方法的 作 用 包 括 标 记 位 置 和 区 间 统 计 两 个 功 能 , 下 面 来 看 下 具 体 用 法 :标 记 位 置G方 法 的 第 一 个 用 法 就 是 标 记 位 置 , 例 如 :1. G(BEGIN);表 示 把 当 前 位 置 标 记 为 BEGIN标 签 , 并 且 记 录 当 前 位 置 的 执 行 时 间 ,
24、 如 果 环 境 支 持 的 话 ,还 能 记 录 内 存 占 用 情 况 。 可 以 在 任 何 位 置 调 用 G方 法 标 记 。运 行 时 间 统 计标 记 位 置 后 , 我 们 就 可 以 再 次 调 用 G方 法 进 行 区 间 统 计 了 , 例 如 :1. G(BEGIN);2. / .其 他 代 码 段3. G(END);4. / .也 许 这 里 还 有 其 他 代 码5. / 进 行 统 计 区 间6. ECHO G(BEGIN,END).S;G(BEGIN,END) 表 示 统 计 BEGIN位 置 到 END位 置 的 执 行 时 间 ( 单 位 是 秒 ) , B
25、EGIN必 须是 一 个 已 经 标 记 过 的 位 置 , 如 果 这 个 时 候 END位 置 还 没 被 标 记 过 , 则 会 自 动 把 当 前 位置 标 记 为 END标 签 , 输 出 的 结 果 类 似 于 :1. 0.0056S默 认 的 统 计 精 度 是 小 数 点 后 4位 , 如 果 觉 得 这 个 统 计 精 度 不 够 , 还 可 以 设 置 例 如 :1. G(BEGIN,END,6).S;可 能 的 输 出 会 变 成 :1. 0.005587S内 存 开 销 统 计如 果 你 的 环 境 支 持 内 存 占 用 统 计 的 话 , 还 可 以 使 用 G方
26、法 进 行 区 间 内 存 开 销 统 计 ( 单位 为 KB) , 例 如 :1. ECHO G(BEGIN,END,M).KB;第 三 个 参 数 使 用 M表 示 进 行 内 存 开 销 统 计 , 输 出 的 结 果 可 能 是 :1. 625KB同 样 , 如 果 END标 签 没 有 被 标 记 的 话 , 会 自 动 把 当 前 位 置 先 标 记 位 END标 签 。如 果 环 境 不 支 持 内 存 统 计 , 则 该 参 数 无 效 , 仍 然 会 进 行 区 间 运 行 时 间 统 计 。忘 掉 DEBUG_START、 DEBUG_END吧 , 大 道 至 简 , 你
27、懂 的 F方法其 实 是 S方 法 的 一 个 子 集 功 能 , 仅 用 于 简 单 数 据 缓 存 , 并 且 只 能 支 持 文 件 形 式 ,不 支 持 缓 存 有 效 期 , 因 为 采 用 的 是 PHP返 回 方 式 , 所 以 其 效 率 较 S方 法 较 高 , 因 此 我们 也 称 之 为 快 速 缓 存 方 法 。F 方 法 的 特 点 是 :简 单 数 据 缓 存 ;文 件 形 式 保 存 ;采 用 PHP返 回 数 据 方 式 加 载 缓 存 ;支 持 子 目 录 缓 存 以 及 自 动 创 建 ;支 持 删 除 缓 存 和 批 量 删 除 ;写 入 和 读 取 缓
28、存1. F(DATA,TEST DATA);默 认 的 保 存 起 始 路 径 是 DATA_PATH( 该 常 量 在 默 认 配 置 位 于RUNTIME_PATH.DATA/下 面 ) , 也 就 是 说 会 生 成 文 件 名 为 DATA_PATH.DATA.PHP的缓 存 文 件 。注 意 : 确 保 你 的 缓 存 标 识 的 唯 一 , 避 免 数 据 覆 盖 和 冲 突 。下 次 读 取 缓 存 数 据 的 时 候 , 使 用 :1. $DATA = F(DATA);我 们 可 以 采 用 子 目 录 方 式 保 存 , 例 如 :1. F(USER/DATA,$DATA);
29、 / 缓 存 写 入2. F(USER/DATA); / 读 取 缓 存就 会 生 成 DATA_PATH.USER/DATA.PHP 缓 存 文 件 , 如 果 USER子 目 录 不 存 在 的 话 , 则会 自 动 创 建 , 也 可 以 支 持 多 级 子 目 录 , 例 如 :1. F(LEVEL1/LEVEL2/DATA,$DATA);如 果 需 要 指 定 缓 存 的 起 始 目 录 , 可 以 用 下 面 的 方 式 :1. F(DATA,$DATA,TEMP_PATH);获 取 的 时 候 则 需 要 使 用 :1. F(DATA,TEMP_PATH);删 除 缓 存删 除
30、缓 存 也 很 简 单 , 使 用 :1. F(DATA,NULL); 第 二 个 参 数 传 入 NULL, 则 表 示 删 除 标 识 为 DATA的 数 据 缓 存 。支 持 批 量 删 除 功 能 , 尤 其 是 针 对 子 目 录 缓 存 的 情 况 , 假 设 我 们 要 删 除 USER子 目 录 下 面的 所 有 缓 存 数 据 , 可 以 使 用 :1. F(USER/*,NULL);又 或 者 使 用 过 滤 条 件 删 除 , 例 如 :1. F(USER/A*,NULL);C方法 是 THINKPHP用 于 设 置 、 获 取 , 以 及 保 存 配 置 参 数 的 方
31、 法 , 使 用 频 率 较 高 。了 解 C方 法 需 要 首 先 了 解 下 THINKPHP的 配 置 , 因 为 C方 法 的 所 有 操 作 都 是 围 绕 配 置相 关 的 。 THINKPHP的 配 置 文 件 采 用 PHP数 组 格 式 定 义 。由 于 采 用 了 函 数 重 载 设 计 , 所 以 用 法 较 多 , 我 们 来 一 一 说 明 下 。设 置 参 数1. C(DB_NAME,THINKPHP);表 示 设 置 DB_NAME配 置 参 数 的 值 为 THINKPHP, 由 于 配 置 参 数 不 区 分 大 小 写 , 所 以 下面 的 写 法 也 是
32、一 样 : -MORE-1. C(DB_NAME,THINKPHP);但 是 建 议 保 持 统 一 大 写 的 配 置 定 义 规 范 。项 目 的 所 有 参 数 在 未 生 效 之 前 都 可 以 通 过 该 方 法 动 态 改 变 配 置 , 最 后 设 置 的 值 会 覆 盖 前面 设 置 或 者 惯 例 配 置 里 面 的 定 义 , 也 可 以 使 用 参 数 配 置 方 法 添 加 新 的 配 置 。支 持 二 级 配 置 参 数 的 设 置 , 例 如 :1. C(USER.USER_ID,8);配 置 参 数 不 建 议 超 过 二 级 。如 果 要 设 置 多 个 参 数
33、 , 可 以 使 用 批 量 设 置 , 例 如 :1. $CONFIGUSER_ID = 1;2. $CONFIGUSER_TYPE = 1;3. C($CONFIG);如 果 C方 法 的 第 一 个 参 数 传 入 数 组 , 就 表 示 批 量 赋 值 , 上 面 的 赋 值 相 当 于 :1. C(USER_ID,1);2. C(USER_TYPE,1);获 取 参 数要 获 取 设 置 的 参 数 , 可 以 用 :1. $USERID = C(USER_ID);2. $USERTYPE = C(USER_TYPE);如 果 USER_ID参 数 尚 未 定 义 过 , 则 返 回
34、 NULL。也 可 以 支 持 获 取 二 级 配 置 参 数 , 例 如 :1. $USERID = C(USER.USER_ID);如 果 传 入 的 配 置 参 数 为 空 , 表 示 获 取 全 部 的 参 数 :1. $CONFIG = C();保 存 设 置3.1版 本 增 加 了 一 个 永 久 保 存 设 置 参 数 的 功 能 , 仅 针 对 批 量 赋 值 的 情 况 , 例 如 :1. $CONFIGUSER_ID = 1;2. $CONFIGUSER_TYPE = 1;3. C($CONFIG,NAME);在 批 量 设 置 了 CONFIG参 数 后 , 会 连 同 当 前 所 有 的 配 置 参 数 保 存 到 缓 存 文 件 ( 或 者 其 他配 置 的 缓 存 方 式 ) 。保 存 之 后 , 如 果 要 取 回 保 存 的 参 数 , 可 以 用1. $CONFIG = C(,NAME);其 中 NAME就 是 前 面 保 存 参 数 时 用 的 缓 存 的 标 识 , 必 须 一 致 才 能 正 确 取 回 保 存 的 参 数 。取 回 的 参 数 会 和 当 前 的 配 置 参 数 合 并 , 无 需 手 动 合 并 。