php - 如何在 php 7 中首次访问时初始化对象属性?
问题描述
假设我有这门课:
class DB {
private DBConnection $connection;
private string $databaseName;
public function __construct($databaseName) {
$this->databaseName = $databaseName;
}
private function initConnection(): void {
if (!isset($this->connection)) {
$this->connection = new DBConnection($this->databaseName);
}
}
public function query($str): array {
$this->initConnection();
return $this->connection->query($str);
}
public function something(): void {
$this->initConnection();
$this->connection->something();
}
}
然后我有一些代码可能会或可能不会调用->query
/->something
方法,具体取决于情况。
我怎样才能避免initConnection
在每个$this->connection
必须使用的地方打电话?我只想在第一次访问时对其进行初始化。
我已经尝试过使用魔术方法__get
,但只有在$connection
不在类定义中时才会调用它。
另一种方法是创建一个访问器方法 ( getConnection
),它调用initConnection
和使用$this->getConnection()
(返回连接对象,而不是void
)而不是$this->connection
,但仍然initConnection
会被调用。
这种方法的问题是我可能会不小心仍然使用$this->connection
getter 方法来代替;有什么办法可以禁止直接使用该物业?
解决方案
在我看来,您是正确的,因为您得出的结论是getConnection
仅在第一次使用时才使用(私有)方法来实例化连接。并让其余的类方法使用getConnection()
而不是$this->connection
.
但是,我也相信您正在体验单例模式的缺点。也许考虑重构出实际的DBConnection
,并将其作为构造函数参数(依赖项)传递给DB
. 然后,您可以提供DBConnection
支持延迟加载和单例的实现。
推荐阅读
- graalvm - 如何判断您的 Java 程序是否在 GraalVM AOT 上下文中运行?
- java - 使用 Jmeter 连接到 MQ,并提供返回地址
- python - 如何将变量注入到 Django 模板的上下文中,类似于内置“url”标签的“as”参数?
- ios - 如何在 Swift 中将 UIColor 转换为 3/4/6/8 位十六进制字符串?
- gradle - 只为一个子项目调用 Gradle 任务
- java - Java Android If Else Break 出现问题故障排除
- python - Scipy welch 和 MATLAB pwelch 不提供相同的答案
- java - Springboot 测试未返回预期结果
- c# - 如何让我的角色以第三人称在镜头周围跑来跑去?
- javascript - 似乎无法将我的 CSS 和 JS/Jquery 文件集成到我的 HTML 中