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



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

这是我模拟的原始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?

首先:这毫无意义。

您正在为已有10多年历史的mysql_*函数创建一个对象包装器。不再维护这个php扩展,并且弃用过程已经开始。2012年,您不应将此API用于任何新项目。

相反,您应该学习如何使用PDO或MySQLi,并使用准备好的语句。

话虽如此。。让我们看看你的代码:

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

嗯,它还不会完全运行。您需要更改变量,使其与您的连接参数匹配:

$dbHost = "localhost";

应该是

$this->dbHost = 'localhost';

我通常根本不会把我的登录参数放在类中。我会在创建对象时将它们传递到构造函数中。使用外部配置文件,这样您就可以在多个生成中实际使用此类。:)

更新::

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

  • 结账http://redbeanphp.com/它将允许您进行psuedoORM风格的数据建模。安装起来超级容易,数据库启动和运行起来也非常容易。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文件中包含一个配置文件来访问您的类

希望这能为你指明正确的方向!祝你好运

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

最好不要给这些参数提供任何默认值,而是让它们从外部设置。

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

他们已经有很多PHP工具,找到它们,阅读它们,并从中学习。首先,使用PDO,在Java中正确的东西在PHP中并不总是正确的。

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

只有当你有一个数据库连接,并且你很乐意对连接值进行硬编码(你不应该这样做)时,你的第一个例子才有用。第二个例子,如果添加一个$name参数作为参数,则可以用于连接多个数据库:

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

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

因此,使用这种样式,您现在有了一个更有用的类。

这是我的,它运行得很好:

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文件中,在服务器上受密码保护的文件夹中,并且只包含在每个类文件中。这也将在尝试另一个连接之前检查一个连接是否已经打开。如果已经建立了一个,它会将打开的连接传递给该方法。

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

最新更新