我不能使用我自己的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
- 遵循命名/自动加载约定,例如 PSR-0。
- 使用自动加载器,如果您为类使用 require/include,那么您很可能做错了。
- 仅仅将代码包装在
class
中并称之为 OOP 是不够的。 - 我认为您没有理由不能扩展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
}
}