首先,我想说清楚这是一种效率和编码偏好"问题 - 不是逻辑或语法问题。
我正在尝试为我的数据库交互和逻辑构建一个类。在本课程中,我发现自己"定义"同一组变量三次([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?
答案 0 :(得分:1)
在您的情况下,如果db_server
,db_user
,db_password_file
在运行时不会动态更改,您最好定义为constant
而不是{{1为了获得更高效的性能。
正如您所提到的,它们是通过property
函数从.env
文件中读取的。是的,预定义的常量或属性无法调用函数或表达式。如果我是你,我会在构建时创建一个连接。
getenv()
答案 1 :(得分:1)
第1区和第2区看起来不可避免。他们必须完成这项任务。
区域3,但是,有一个技巧可以使用。您可以使用以下命令轻松地使用本地等效项定义所有类变量:
extract(get_object_vars($this));
这里发生的是get_object_vars()
返回在指定对象上定义的所有变量的数组。在这种情况下,我们定位$this
,这是类实例。它将提供一个包含所有已定义类变量的数组,然后在传递给extract()
时将其创建为本地副本。
如果需要更改这些类变量的值,这样可以干净利落地工作。否则,使用常量可能更漂亮。