首页 > 解决方案 > 如何在 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->connectiongetter 方法来代替;有什么办法可以禁止直接使用该物业?

标签: phpoop

解决方案


在我看来,您是正确的,因为您得出的结论是getConnection仅在第一次使用时才使用(私有)方法来实例化连接。并让其余的类方法使用getConnection()而不是$this->connection.

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


推荐阅读