
本文介绍如何利用静态方法从一个类中读取配置值,并动态注入到另一个类的数据库连接参数中,实现配置与逻辑分离,提升代码可维护性。
本文介绍如何利用静态方法从一个类中读取配置值,并动态注入到另一个类的数据库连接参数中,实现配置与逻辑分离,提升代码可维护性。
在 PHP 面向对象开发中,将配置信息(如数据库连接参数)与业务逻辑解耦是良好实践。上述场景中,Functions 类封装了从 config.ini 文件读取配置的静态方法 Get_Config(),而 Connection 类负责建立 PDO 连接。为避免硬编码数据库凭证,应将 host、port、dbname、username 和 password 等参数动态从配置中获取。
关键改进在于:不在属性声明阶段初始化敏感配置,而是在运行时、连接建立前即时调用 Functions::Get_Config() 获取值。原因如下:
- 类属性(
private $server = "...")仅支持编译期字面量赋值,无法执行函数调用; - 静态方法调用必须发生在可执行上下文中(如方法体内),而非属性定义处。
以下是优化后的 Connection 类完整实现:
<?php
class Connection {
private $server;
private $user;
private $pass;
private $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
protected $con;
public function openConnection() {
try {
// 动态构建 DSN 并获取认证信息
$host = Functions::Get_Config('DB', 'host');
$port = Functions::Get_Config('DB', 'port');
$dbname = Functions::Get_Config('DB', 'name'); // 注意:原问题中 config key 为 'db_name',但示例代码用了 'name',请按实际 config.ini 键名调整
$user = Functions::Get_Config('DB', 'username');
$pass = Functions::Get_Config('DB', 'password');
$this->server = "mysql:host={$host};port={$port};dbname={$dbname}";
$this->user = $user;
$this->pass = $pass;
$this->con = new PDO($this->server, $this->user, $this->pass, $this->options);
return $this->con;
} catch (PDOException $e) {
error_log("Database connection failed: " . $e->getMessage());
return null;
}
}
public function closeConnection() {
$this->con = null;
}
}✅ 注意事项与最佳实践:
立即学习“PHP免费学习笔记(深入)”;
-
配置键名一致性:确保
Get_Config('DB', 'xxx')中的键(如'name'或'db_name')与config.ini中的实际字段完全匹配(区分大小写); -
错误防御:建议在
Get_Config()中增加空值/异常检查,例如返回默认值或抛出InvalidArgumentException; -
性能优化:若配置频繁读取,可在
Functions类中缓存$config_data(如使用static $config_cache),避免重复解析 INI 文件; -
安全性:切勿将数据库密码等敏感信息提交至版本控制;推荐配合
.gitignore排除config/config.ini,并提供config/config.ini.example模板; -
依赖显式化:当前
Connection依赖Functions类,应在文件头部添加require_once 'class_Functions.php';或通过自动加载机制引入。
通过该方式,配置管理集中、连接逻辑清晰,后续只需修改 config.ini 即可切换不同环境(开发/测试/生产)的数据库设置,真正实现“一次配置,多处生效”。



















