【问题标题】:Should a constructor do more than just create an instance?构造函数应该做的不仅仅是创建一个实例吗?
【发布时间】:2019-06-29 16:45:57
【问题描述】:

试图理解和使用 PHP 中的 OOP 我有一个名为 dbcon 的类。我正在关注 youtube 中的教程,该教程使用受保护的 connect() 函数连接到数据库。现在我的问题是为什么不在构造函数中连接到db?

function __construct() {
      $this->DBSERVER  = "localhost" 
      $this->DBUSERNAME = "root" 
      $this->DBPASSWORD = "" 
      $this->DBNAME    = "thedb" 

      $conn = new mysqli($this->DBSERVER, $this->DBUSERNAME, $this->DBPASSWORD, $this->DBNAME);
      if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
      }     
      return $conn;
    } 
    }

谁能告诉我这样做有什么好处或坏处?

<?PHP
class dbcon {
    private $DBSERVER;
    private $DBUSERNAME;
    private $DBPASSWORD;
    private $DBNAME;

    protected function connect(){
      $this->DBSERVER   = "localhost" 
      $this->DBUSERNAME = "root" 
      $this->DBPASSWORD = "" 
      $this->DBNAME     = "thedb" 

      $conn = new mysqli($this->DBSERVER, $this->DBUSERNAME, $this->DBPASSWORD, $this->DBNAME);
      if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
      }     
      return $conn;
    }
}
?>

【问题讨论】:

  • 简而言之,为什么不呢?这是一个设计决定,准确地说是您的决定。您设计 dbconn() 类的方式的优点/缺点将取决于它(需要)如何与应用程序中的其他对象进行通信。如果可以的话,建议您熟悉interface not an implementation 的编码,这将使您的代码更加灵活和面向未来。
  • 你不能从构造函数返回值,你通常会设置一个实例变量。
  • 我认为this 是对构造函数用法的一个很好的一般解释,而this 是我更推荐处理连接的方式。

标签: php oop


【解决方案1】:

我的第一个想法是,这可能很难进行单元测试。每次从该类创建实例时,都必须有一个可以连接到的数据库,否则它将失败。

当然,connect() 方法仍然很难测试,但您可以轻松测试其余部分。

有一个技巧可以在一行中调用一个方法并创建一个类的实例:

($myDBInstance = new dbcon("localhost", "mirko", "mysecret", "mydb"))->connect();

另一种方法是调用静态方法,这很清楚,即自动连接,如果您不喜欢上述解决方案:

$myDBInstance = dbcon::getInstanceAndConnect("localhost", "mirko", "mysecret", "mydb");

可能看起来像:

public static getInstanceAndConnect(a,b,c,d) {
     $mydbcon=new dbcon(a,b,c,d);
     $mydbcon->connect();
     return $mydbcon;
}

对不起,懒惰的论点:-)

【讨论】:

    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 2015-12-24
    • 2021-02-03
    • 2013-04-10
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多