2

我不能使用我自己的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 的方法。

4

3 回答 3

4

如果您希望能够这样使用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
于 2012-12-07T20:25:47.870 回答
3

任何构造函数的返回类型都应该是void. 您使用构造函数来初始化对象属性。调用时的返回值new ClassName()将是 type 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
    }
}
于 2012-12-07T20:29:35.830 回答
3
  1. 遵循命名/自动加载约定,例如PSR-0
  2. 使用 Autoloader,如果你对你的类使用 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);
  }

}
于 2012-12-07T20:36:20.533 回答