在类中创建连接函数的不同方法?

时间:2013-11-27 17:50:53

标签: php mysql class oop pdo

好吧所以我有一些愚蠢的问题,我在制作CMS时看到了不同的东西,我想制作一个oop CMS,我想知道是否有人可以向我解释它之间的区别是什么使用两个例子中的一个?

Ex 1 -

 class myClass
 {
      var $username;
      var $password;

      public function connect()
      {
           try {
                $pdo = new PDO('mysql:host=localhost;dbname=dbname', $this->username,
                     $this->password);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                return $pdo;
           } catch(PDOException $e) {
                echo 'Error: ' . $e->getMessage();
           }
       }
 }
 // Then to call that function
 $obj = new myClass();
 $obj->username = "root";
 $obj->password = "password";
 $pdo = $obj->connect();
 // Then run my query down here

前2 -

 class database
 {
      protected $connection = null;
      //make a connection
      public function __construct($hostname,$dbname,$username,$password)
      {
           try {
                //MySQL with PDO_MYSQL  
                $this->connection = new PDO("mysql:host=$hostname;dbname=$dbname",
                     $username, $password);
                $this->connection->setAttribute(PDO::ATTR_ERRMODE,
                     PDO::ERRMODE_EXCEPTION); 
           } catch (PDOException $e) {
                $this->connection = null;
                die($e->getMessage());
           }
       }
  }

或者我甚至看到人们使用__construct然后单独的连接功能 那究竟是什么区别呢?通过特定的方式实现性能优势吗?或者有没有比另一种更正确的方法,或者如果这些方法不正确,那么这三种方法都是正确的吗?我找不到可靠的来源找到答案。

2 个答案:

答案 0 :(得分:2)

对于大多数情况,第三个例子是最好的:

事实上,PDO已经已经一个数据库类。因此,如果您没有特别的理由在其上创建另一个,PDO itelf就是一个完美的:

$pdo = new PDO('mysql:host=localhost;dbname=dbname', $username,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

是你真正需要的。

答案 1 :(得分:1)

两者之间没有明显的性能差异。

第二种方式是很多人的首选,因为如果数据库对象没有尝试连接到数据库,它将会变得无用。因为尝试连接数据库对于对象的价值/存在至关重要,所以通过构造函数发送连接细节是有意义的,这样它就可以在实例化后立即尝试连接。因此,改变:

$obj = new myClass();
$obj->username = "root";
$obj->password = "password";
$pdo = $obj->connect();

$obj = new myClass('localhost', 'root', 'mypassword');