Php 在我自己的类中使用PDO连接

Php 在我自己的类中使用PDO连接,php,pdo,Php,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(

我无法使用我自己的
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() { 
        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_连接类的方法,但我想使用在
pdo_连接
类中创建的pdo方法。

如果你想像那样使用
pdo_连接
,你必须扩展pdo

例如:

class db extends PDO {
然后,在该类中,在
\uuu-construct
中,使用
父::\uu-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

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

也就是说,如果您想扩展class
PDO
,可以这样做:

类pdo_连接扩展了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
    }
}
  • 遵循命名/自动加载约定,例如
  • 使用Autoloader,如果您在类中使用require/include,则很可能是做错了
  • 仅将代码包装在
    类中并称之为OOP是不够的
  • 我看不出你为什么不能扩展PDO,但无论如何

  • op发布的类不扩展PDO,链接的文章包含一些,呃,可疑的语句和信息,但总体思路是可以的-请注意,您需要调用
    $this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)
    要使PDO抛出异常,而不是在任何后续活动(在构造函数之后)中触发错误,强烈建议(如果不是必要的话)在使用MySQL时调用
    $this->db->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,FALSE)
    。链接的文章非常旧,一些背景:-当你从中得出结论时,请检查你的来源。
    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);
      }
    
    }