如何在php 7中首次访问时初始化对象属性?

时间:2020-04-23 09:35:05

标签: php oop

让我说我上了这个课:

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方法。有什么方法可以禁止直接使用该属性?

1 个答案:

答案 0 :(得分:-1)

我认为,结论是正确的,可以使用一个(专用)getConnection方法仅在首次使用时实例化该连接。并让其余的类方法使用getConnection()而不是$this->connection

但是,我也相信您正在经历单例模式的弊端。也许考虑重构实际的DBConnection,并将其作为构造函数参数(依赖项)传递给DB。然后,您可以提供支持延迟加载和单例的DBConnection实现。