如果一个构造函数做的不仅仅是创建一个实例?

问题描述 投票:0回答:1

试图了解和使用OOP在PHP我有一个名为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;
    }
}
?>
php oop
1个回答
0
投票

我对这个第一个想到的是,这可能是很难单元测试。你在做实例从该类每次,必须有一个数据库,在那里你可以连接到,否则它会失败。

当然,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;
}

遗憾的懒惰参数:-)

© www.soinside.com 2019 - 2024. All rights reserved.