让我说我上了这个课:
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
)而不是{{ 1}},但$this->connection
却一无所获。
这种方法的问题在于,我可能仍然不小心使用initConnection
而不是getter方法。有什么方法可以禁止直接使用该属性?
答案 0 :(得分:-1)
我认为,结论是正确的,可以使用一个(专用)getConnection
方法仅在首次使用时实例化该连接。并让其余的类方法使用getConnection()
而不是$this->connection
。
但是,我也相信您正在经历单例模式的弊端。也许考虑重构实际的DBConnection
,并将其作为构造函数参数(依赖项)传递给DB
。然后,您可以提供支持延迟加载和单例的DBConnection
实现。