PHP:数据库连接类构造方法

Aar*_*ron 2 php oop database-connection class

我是OOP的新手.最初我是在类中和构造函数之外定义变量并为它们赋值,但是在今天的Java课程中,我被告知这是一种糟糕的风格,应该避免.

这是我模拟的原始PHP数据库连接类:

class DatabaseConnection {
    private $dbHost = "localhost";
    private $dbUser = "root";
    private $dbPass = "";
    private $dbName = "test";

    function __construct() {    
        $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass)
            or die("Could not connect to the database:<br />" . mysql_error());
        mysql_select_db($this->dbName, $connection) 
            or die("Database error:<br />" . mysql_error());
    }
}
Run Code Online (Sandbox Code Playgroud)

以上认为可以吗?或者以下是更好的方法?

class DatabaseConnection {
    private $dbHost;
    private $dbUser;
    private $dbPass;
    private $dbName;

    function __construct() {
        $this->dbHost = "localhost";
        $this->dbUser = "root";
        $this->dbPass = "";
        $this->dbName = "test";

        $connection = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass)
            or die("Could not connect to the database:<br />" . mysql_error());
        mysql_select_db($this->dbName, $connection) 
            or die("Database error:<br />" . mysql_error());
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该关注什么以确保我正确理解OOP?

Mat*_*rte 9

好吧,它还没有运行.您需要更改变量,使它们与您的连接参数匹配:

$dbHost = "localhost";
Run Code Online (Sandbox Code Playgroud)

应该

$this->dbHost = 'localhost';
Run Code Online (Sandbox Code Playgroud)

我通常不会把我的登录参数放在课堂里.我会在创建对象时将它们传递给构造函数.使用外部配置文件,以便您可以在多个版本上实际使用此类.:)

更新::

好的,所以这里有一些小的OOP配置gold-nuggets可以帮助你构建一个动态的Database类.

  • 查看http://redbeanphp.com/它将允许您进行伪造的ORM风格的数据建模.超级易于安装,并且非常容易使您的数据库正常运行.http://redbeanphp.com/manual/installing

  • 在版本控制的环境中工作时,创建包含常量,模板设置,常用功能和AUTOLOADER配置文件等配置文件是关键.:)

  • 建立你的数据库类为抽象类http://php.net/manual/en/language.oop5.abstract.php

    abstract class Database
    {
      public function update()
      {
      }
    
      public function deactivate()
      {
      }
    
      public function destroy()
      {
      }
    
      //etc.
    }
    
    class MyAppObject extends Database
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 将所有类文件放入库文件夹,然后将配置文件放入该库中.现在,为了让您的生活更轻松,您可以使用自动加载器功能,在您需要时将您的课程变为现实,而无需包含任何特定课程.见下文:

    //note: this is never explicitly instantiated
    //note: name your files like this: MyAppObject.class.php  
    function my_fancypants_autoloader( $my_class_name )
    {
      if( preg_match( "%^_(Model_)%", $my_class_name ) ) return;
      require_once( "$my_class_name.class.php" );
    }
    spl_autoload_register( 'my_fancypants_autoloader' );
    
    Run Code Online (Sandbox Code Playgroud)
    • 现在,您只需在.php文件中包含一个配置文件即可访问您的类.

希望指出你正确的方向!祝好运!


ter*_*ško 9

首先:这是毫无意义的.

您正在为10年以上的mysql_*功能创建一个对象包装器.不再维护此php扩展,并且已经开始弃用过程.您不应该在2012年将此API用于任何新项目.

相反,您应该学习如何使用PDOMySQLi并使用准备语句.

那说..让我们来看看你的代码:

  • 构造函数应该接收创建新实例所需的所有参数,参数不应该在类定义中进行硬编码.如果您需要同时使用两个数据库怎么办?
  • 创建连接时,应将其存储在对象的范围变量中.有点像$this->connection = mysql_conn....而是将它存储在局部变量中,在构造函数完成后您将"松散".
  • 你不应该private为一切使用变量.它们对于扩展原始类的类是不可见的.除非是故意的,否则你应该选择protected这个.
  • or die('..')位最走.如果连接失败,请不要停止整个应用程序.相反,你应该抛出一个异常,然后可以在构造函数之外处理.