利用 PHP 的 OOP 特性实现数据保护
在 PHP 4 中,声明变量通常使用 var,而在 PHP 5 中,可使用面向对象编程(OOP)的
特性来自定义数据的可见性--即可访问性,可见性在此与变量作用域非常类似,但提供
了 更 好 的 控 制 机 制 , 有 以 下 三 种 类 型 的 可 见 性 修 饰 符 :
Public ( 默 认 ) -- 变 量 可 在 全 局 范 围 内 访 问 或 修 改 。
Protected--变量只能在类本身及直接派生(使用 extends 语句)类内访问或修改。
Private--
变
量
只
能
在
类
内
部
访
问
或
修
改
。
与接口实现类似,在程序中违反这些规则将会导致严重的错误;且与接口类似的是 ,
它们的存在纯粹是为了方便程序员。但这并不意味着可以忽略它们,指定某个类成员变量
的 可 见 性 , 可 保 护 对 象 内 的 数 据 免 受 外 界 影 响 。
假设有一个 MySqlDB 类,一个$link 变量在其中声明为 private,这意味着这个变
量只能从对象内部使用$this 变量访问,这防止了类外其他对象或函数的意外覆盖,在此,
我 们 将 使 用 可 见 性 特 性 帮 助 我 们 创 建 一 个 query 对 象 。
你可以把 query 当作一个单独的实体,它可以执行,并且返回结果。一些数据库系
统也具有存储过程,存储过程与函数很相似,它们存储查询语句,并在调用时接受相应
的参数,但 MySQL 在 5.1 版本之前并没有提供类似功能,某些其他类型的数据库管理
系
统
也
没
有
。
在本文中,将把上述两个特性结合进示例的 query 对象中,示例将模拟一个基本的
存储过程,并在内部保存结果指针。目前,重点是从对象中执行 query,在此可以调用
MySqlDB
对
象
的
query()
函
数
。
可 在
query
对 象 中 定 义 如 下 的
public
函 数 :
__construct()--构造函数接受一个包含了实现 DB 接口对象实例引用的参数。
prepare()--函数 prepare()初始化 query 的存储过程。它可能包含一个或多个有限
的占位符,而其将会作为参数传递给 execute()函数。占位符定义为与参数个数有关的一
个 冒 号 紧 跟 一 个 整 数 及 与 参 数 类 型 有 关 的 一 个 字 母 。
包 含 占 位 符 的 一 个 简 单 的 query 看 起 来 像 以 下 这 样 :
SELECT
col1,col2
FROM
table_name
WHERE
col1=:1I
execute()--函数 execute()将执行 query。如果它被 prepare()函数过早地初始化为
一个存储过程,任何传递进来的参数都会被作为存储过程的执行参数,否则,第一个参
数 只 会 被 作 为 查 询 文 本 。 函 数 execute() 将 返 回 执 行 查 询 后 的 结 果 。
compile()--函数 compile()与函数 execute()类似,实际上,query 并没有执行,
而是替换查询字符串中所有占位符,接受存储过程的参数,并返回 query 的编译版本。
受
保
护
的
成
员
正如上面所提到的,可见性的概念可用于隐藏对象的内部工作,保护内部工作所需
的数据完整性。前面已经解释,query 返回的结果指针将会保存为 protected 属性,在此
使用保护成员是因为从 query 对象派生出来的特定数据库 query 对象可能会重载某些核
心
功
能
。
深
掘
代
码
理 论 说 够 了 , 现 在 开 始 编 写 代 码 , 首 先 , 创 建 一 个 例 1 所 示 的 模 板 :
例
1
:
数
据
库
query
类
的
一
个
模
板
class
DBQuery
{
/**