PHP 面向对象基础与数据库封装实践
了解 PHP 面向对象编程中访问修饰符的作用范围,并通过实际代码演示如何利用类的属性与方法封装一个简单的数据库查询操作,提升代码复用性。
理解访问控制权限
在面向对象编程中,类成员(属性和方法)的可见性由访问修饰符决定。合理设置权限有助于数据安全和逻辑隔离:
public:公有访问。类内部、子类以及外部脚本均可直接调用和修改,是最开放的权限。protected:受保护访问。仅当前类和其子类可以访问,常用于基类向派生类提供必要支持。private:私有访问。仅限当前类内部使用,子类和外部对象均无法直接触及,适用于隐藏实现细节。
第1步:定义数据库连接类
目的:创建一个可复用的 db 类,将数据库连接逻辑封装其中。
入口:新建 PHP 文件并声明 class db。
动作:引入以下核心结构:
<?php
class db {
private $mysqli; // 存储数据库连接对象
private $options = []; // 存储查询选项
private $tableName; // 表名
// 构造函数接收表名参数
public function __construct($tabName) {
$this->tableName = $tabName;
$this->db(); // 初始化连接
}
// 私有方法建立数据库连接
private function db() {
// 注意:GBK 已弃用,生产环境建议使用 utf8mb4
$this->mysqli = new mysqli('localhost', 'root', '', 'hdcms');
$this->mysqli->query("SET NAMES UTF8");
}
}
?
- 定义私有属性以隔离内部状态。
- 在
__construct中绑定表名并触发连接。 - 确保数据库配置信息被安全存储在类内。
第2步:构建查询条件与方法链
目的:通过设置字段和排序规则,为生成 SQL 语句做准备。
入口:继续编辑 db 类。
动作:添加用于设置选择字段和排序的方法:
// 设置选择的字段
public function fields($fieldsArr) {
if (empty($fieldsArr)) {
$this->options['fields'] = '';
} elseif (is_array($fieldsArr)) {
$this->options['fields'] = implode(',', $fieldsArr);
} else {
$this->options['fields'] = $fieldsArr;
}
return $this; // 返回当前对象实例,支持链式调用
}
// 设置排序规则
public function order($str) {
$this->options['order'] = "ORDER BY " . $str;
return $this; // 同样返回当前对象实例
}
- 通过判断输入类型灵活处理字段数组。
- 将配置存入
$options数组中。 - 每次执行后返回
$this,从而实现类似$obj->a()->b()的链式写法。
第3步:执行查询与结果获取
目的:组合上述选项生成最终 SQL 并返回二维数组结果集。
入口:添加 select 方法。
动作:组装 SQL 字符串并执行:
public function select() {
// 检查是否设置了 fields,若为空则默认为 *
$fields = !empty($this->options['fields'])
? $this->options['fields']
: '*';
$sql = "SELECT {$fields} FROM {$this->tableName}";
if (!empty($this->options['order'])) {
$sql .= " {$this->options['order']}";
}
return $this->query($sql);
}
private function query($sql) {
$result = $this->mysqli->query($sql);
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
return $rows;
}
- 动态拼接
SELECT和ORDER BY子句。 - 利用
fetch_assoc逐行提取数据到数组。 - 防止因未选字段导致的语法错误。
第4步:资源释放与类的使用
目的:确保数据库连接在使用完毕后自动断开,并在外部正确调用。
入口:完善类的析构函数,并在类外实例化对象。
动作::
private function close() {
if ($this->mysqli instanceof mysqli) {
$this->mysqli->close();
}
}
// 当对象不再被引用时自动执行关闭
function __destruct() {
$this->close();
}
}
调用示例:
$channel = new db("hdw_channel");
$info = $channel->fields('id,cname,cpath')->order('id DESC')->select();
print_r($info);
- 利用
__destruct销毁对象前关闭连接,避免资源泄露。 - 创建实例并传入目标表名。
- 串联方法完成筛选、排序并获取数据。
继承关系演示
除了封装,继承也是 OOP 的重要组成部分。子类可以继承父类的方法:
class A {
protected function aa() {
echo "Protected method called";
}
}
class B extends A {
public function bb() {
$this->aa(); // 合法调用,因为 B 是 A 的子类
}
}
$b = new B();
$b->bb();
在此例中,父类 A 中的 aa 方法声明为 protected,虽然外部不可见,但子类 B 内部依然可以正常访问执行。
简要总结
通过将数据库连接和操作封装在类中,并结合访问控制权限,可以有效管理状态并简化 SQL 编写流程。掌握这些基础特性是深入理解 PHP 框架设计的前提。以上就是 PHP 面向对象编程与基础封装的详细内容,更多关于 PHP 技术进阶的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













