以有效且可读的方式声明属性和变量?

时间:2018-01-28 02:22:37

标签: php oop syntax properties standards

首先,我想说清楚这是一种效率和编码偏好"问题 - 不是逻辑或语法问题。

我正在尝试为我的数据库交互和逻辑构建一个类。在本课程中,我发现自己"定义"同一组变量三次([Area 1][Area 2][Area 3])。

这似乎是多余的和误导性的 - 必须有一种更好的做事方式,对吗?

目前,我的代码看起来像这样:

class db_connection {

   // [Area 1] define properties
   private $db_server;
   private $db_user;
   private $db_password_file;
   private $db_name;

   public function __construct() {
      // [Area 2] give each property a value based on environment variables
      $this->db_server = getenv( 'DB_HOST' );
      $this->db_user = getenv( 'DB_USER' );
      $this->db_password_file = getenv( 'DB_PASSWORD_FILE' );
      $this->db_name = getenv( 'DB_NAME' );
   }

   // create a function to perform connection logic
   public function connect() {

      // [Area 3] give each property a "labeling" variable for readability and ease-of-use
      $db_server = $this->db_server;
      $db_user = $this->db_user;
      $db_password_file = $this->db_password_file;
      $db_name = $this->db_name;

      [...]

我的理由是"定义"在我的三个"区域":

中的每一个

[区域1]
在类定义顶部声明属性是标准做法。通常,这些属性也会被初始化(带有值),但这不可能,因为我想使用getenv()为这些属性分配非常量值。有关详细信息,请参阅documentation

[区域2]
遵循我的[Area 1]逻辑,我使用类构造函数初始化我的属性。

[区域3]
为了保持我的连接逻辑清洁,我给了我的每个属性一个本地"标签"变量。我在其余的代码中使用了这些属性,因此使用$db_user$this->db_user之类的名称可以使事情更容易,更易读。

这似乎只是4个属性/变量的很多代码......

有更好的组织方式吗?我应该做些什么呢?

可以在某处定义常量,还是使用static keyword help?

2 个答案:

答案 0 :(得分:1)

在您的情况下,如果db_serverdb_userdb_password_file在运行时不会动态更改,您最好定义为constant而不是{{1为了获得更高效的性能。

正如您所提到的,它们是通过property函数从.env文件中读取的。是的,预定义的常量或属性无法调用函数或表达式。如果我是你,我会在构建时创建一个连接。

getenv()

答案 1 :(得分:1)

第1区和第2区看起来不可避免。他们必须完成这项任务。

区域3,但是,有一个技巧可以使用。您可以使用以下命令轻松地使用本地等效项定义所有类变量:

extract(get_object_vars($this));

这里发生的是get_object_vars()返回在指定对象上定义的所有变量的数组。在这种情况下,我们定位$this,这是类实例。它将提供一个包含所有已定义类变量的数组,然后在传递给extract()时将其创建为本地副本。

如果需要更改这些类变量的值,这样可以干净利落地工作。否则,使用常量可能更漂亮。