将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 方法。

如果你想能够使用这样的pdo_connection,你必须扩展PDO。

例:

class db extends PDO {

然后,在该类中,在 __construct 中使用 parent::__construct

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

这是我创建的使用该方法的类:[链接]

用法:

include_once 'db.php';
$db = new db('user');
// Do stuff with $db
  1. 遵循命名/自动加载约定,例如 PSR-0。
  2. 使用自动加载器,如果您为类使用 require/include,那么您很可能做错了。
  3. 仅仅将代码包装在class中并称之为 OOP 是不够的。
  4. 我认为您没有理由不能扩展PDO,但无论如何...

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

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

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

class pdo_connection extends PDO { ... }

但是,就我个人而言,我不会这样做。 事实上,快速搜索将我带到了这篇文章:

  • 扩展PDO是一种浪费...(2005年9月22日;作者:Davey Shafik)

请记住,我个人从未尝试过扩展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
    }
}

相关内容

最新更新