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

时间:2012-03-30 06:23:09

标签: php oop class database-connection

我是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());
    }
}

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

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());
    }
}

我应该注意什么才能确保我正确理解OOP?

6 个答案:

答案 0 :(得分:9)

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

$dbHost = "localhost";

应该是

$this->dbHost = 'localhost';

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

更新::

好的,所以这里有一些小OOP配置的金块可以帮助你构建一个动态的数据库类。

  • 签出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
    {
    }
    
  • 将所有类文件放入库文件夹,然后将配置文件放入该库中。现在,为了让您的生活更轻松,您可以使用自动加载器功能,在您需要时使您的课程生动,而不必包含任何特定的课程。见下文:

    //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' );
    
    • 现在,您只需在.php文件中包含一个配置文件即可访问您的课程。

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

答案 1 :(得分:8)

首先:这是没有意义的。

您正在为10年以上的mysql_*函数创建一个对象包装器。不再维护此php扩展,并且弃用过程为already begun。您不应该在2012年将此API用于任何新项目。

相反,您应该学习如何使用PDOMySQLi并使用prepared statements

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

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

答案 2 :(得分:0)

由于您只将它们用于__construct方法,因此您不需要它们作为类属性。只有$connection必须保留以供以后使用imho。

最好不要给这些参数赋予任何默认值,但让它们从外部设置。

$db = new DatabaseConnection("localhost", "user", "password", "db");

他们已经有大量的PHP工具,找到它们,阅读它们并从中学习。首先,使用PDO,Java中的真实情况在PHP中并不总是如此。

答案 3 :(得分:0)

后者可能更好,但需要调整:将一些参数传递给构造函数,即连接信息。

您的第一个示例仅在您拥有一个数据库连接时才有用,并且只有在您对连接值进行硬编码时才会有用(您不应该这样)。第二个例子,如果你添加say,$name参数作为参数,可以用来连接到多个数据库:

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

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

    function __construct($config) {
        // Process the config file and dump the variables into $config
        $this->dbHost = $config['host'];
        $this->dbName = $config['name'];
        $this->dbUser = $config['user'];
        $this->dbPass = $config['pass'];

        $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());
    }
}

因此,使用此样式,您现在可以使用更有用的类。

答案 4 :(得分:0)

这是我的,它运作得相当好:

class Database
{
   private static $_dbUser = 'user';
   private static $_dbPass = 'pwd';
   private static $_dbDB = 'dbname';
   private static $_dbHost = 'localhost';
   private static $_connection = NULL;

   /**
    * Constructor
    * prevents new Object creation
    */

   private function __construct(){
   }

   /**
    * Get Database connection
    * 
    * @return Mysqli
    */

   public static function getConnection() {
      if (!self::$_connection) {
     self::$_connection = @new mysqli(self::$_dbHost, self::$_dbUser, self::$_dbPass, self::$_dbDB);

         if (self::$_connection -> connect_error) {
            die('Connect Error: ' . self::$_connection->connect_error);
         }
      }
      return self::$_connection;
   }
}

通过使__construct为空,它可以防止从任何地方实例化新类。然后,让函数变为静态,所以现在我需要做的就是Database::getConnection()这就是include文件,位于服务器上受密码保护的文件夹中,并且只包含在每个类中文件。这也将在尝试另一个连接之前检查连接是否已打开。如果已经建立了一个,它将打开的连接传递给方法。

答案 5 :(得分:-2)

<?php

    class config
    {
        private $host='localhost';
        private $username='root';
        private $password='';
        private $dbname='khandla';

        function __construct()
        {   
            if(mysql_connect($this->host,$this->username,$this->password))
            {
                echo "connection successfully";
            }
        }
        function db()
        {
            mysql_select_db($this->$dbname);
        }
    }

    $obj=new config();
?>