与我自己的类使用PDO连接

时间:2012-12-07 20:17:57

标签: php pdo

我无法使用我自己的pdo_connection类中的PDO类方法,无论是否有extends PDO,它都无法正常工作。

Class pdo_connection { 
//connection create 
    private $dbhost = "127.0.0.1"; 
    private $dbname = "db"; 
    private $dbuser = "user"; 
    private $dbpass = "pass"; 
    public function __construct() { 
        return $db = new PDO('mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass); 
    } 
}

然后当我创建对象时:

require("api/pdo.connection.class.php"); 
$db = new pdo_connection(); 
$db->exec("SET NAMES utf8");  

我不能使用exec,因为它不是pdo_connection类的方法,但是我想使用在pdo_connection类中创建的PDO方法。

3 个答案:

答案 0 :(得分:4)

如果您希望能够像这样使用pdo_connection,则必须扩展PDO。

示例:

class db extends PDO {

然后,在该课程的__construct内,使用parent::__construct

parent::__construct('mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass);

这是我使用该方法制作的课程: [link]

用法:

include_once 'db.php';
$db = new db('user');
// Do stuff with $db

答案 1 :(得分:3)

任何构造函数的返回类型都应为void。您使用构造函数初始化对象属性。致电new ClassName()时的返回值将为ClassName类型。

话虽如此,如果你想扩展课程PDO,你可以这样做:

class pdo_connection extends PDO { ... }

但是,我个人不会这样做。事实上,快速搜索引导我阅读这篇文章:

请记住,我从未亲自尝试来扩展PDO,所以请考虑这一点。

相反,为什么不将PDO对象存储为类属性,然后定义自己的与PDO对象交互的函数?

Class pdo_connection { 
//connection create 
    private $dbhost = "127.0.0.1"; 
    private $dbname = "db"; 
    private $dbuser = "user"; 
    private $dbpass = "pass"; 
    public function __construct() { 
        try { // Don't forget this....
            $this->db = new PDO('mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass); 
        } catch(PDOException $e) { }
    } 

    public function exec() {
     /// do your exec stuff here
    }
}

答案 2 :(得分:3)

  1. 遵循命名/自动加载惯例,例如PSR-0
  2. 使用Autoloader,如果您在课程中使用require / include,那么你很可能是错误的。
  3. class中包装代码并将其称为OOP是不够的。
  4. 我认为没有理由不能扩展PDO,但无论如何......
  5. class MyPdo
    {
    
      protected $db;
      protected $dbhost = '127.0.0.1';
      protected $dbname = 'db';
      protected $dbuser = 'user';
      protected $dbpass = 'pass';
    
      protected function __construct()
      {
        $this->db = PDO('mysql:host=' . $this->dbhost . ';dbname=' . $this->dbname, $this->dbuser, $this->dbpass);
      }
    
      public function __call($method, $args)
      {
        return call_user_func_array(array($this->db, $method), $args);
      }
    
    }