跨脚本调用PDO数据库连接类内private变量的实现方法
解决方案
首先明确:PHP 中被private关键字修饰的类属性,仅允许在类的内部代码中访问,类外部、子类都无法直接调用,你可以根据自己的需求选择以下方案:
方案1:添加公共 getter 方法(最符合OOP封装规范)
在DBconnect类中新增公开的读取方法,按需暴露你需要的私有属性:
<?php class DBconnect { private $host = 'localhost'; private $username = 'db_user'; private $password = 'pass'; private $dbname = 'db'; // 新增公共读取方法,其他属性可以按需加对应的get方法 public function getHost() { return $this->host; } public function getUsername() { return $this->username; } public function getDbname() { return $this->dbname; } protected function connect() { $config = 'mysql:host='.$this->host.';dbname='.$this->dbname; $pdo = new PDO($config, $this->username, $this->password); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); return $pdo; } }
之后在user.php中实例化类之后调用对应方法即可,注意原代码的require语句需要补全引号:
<?php require 'dbconnection.php'; $db = new DBconnect(); echo $db->getHost(); // 输出 localhost echo $db->getUsername(); // 输出 db_user
方案2:仅获取数据库连接(更推荐的封装用法)
如果你不需要单独拿到配置参数,只是要操作数据库,可以直接新增公开方法返回PDO实例,不需要暴露私有配置:
修改DBconnect类,新增公共获取连接的方法:
public function getConnection() { return $this->connect(); }
在user.php中直接获取连接执行操作即可:
<?php require 'dbconnection.php'; $db = new DBconnect(); $pdo = $db->getConnection(); // 直接用PDO实例执行查询 $userList = $pdo->query("SELECT * FROM users")->fetchAll();
方案3:强制访问私有属性(不推荐,仅作了解)
如果特殊场景下不能修改原类代码,需要强制读取私有属性,可以用反射实现:
<?php require 'dbconnection.php'; $db = new DBconnect(); $reflection = new ReflectionClass($db); // 读取host属性 $hostProp = $reflection->getProperty('host'); $hostProp->setAccessible(true); echo $hostProp->getValue($db); // 输出 localhost // 读取password属性 $passProp = $reflection->getProperty('password'); $passProp->setAccessible(true); echo $passProp->getValue($db); // 输出 pass
这种方式会破坏类的封装性,生产环境不建议使用。
内容的提问来源于stack exchange,提问作者Stevooh
相关产品推荐
相关产品推荐

