关于这个话题有一百万个问题..但我没有看到它完全像这样。我刚刚开始使用OOP PHP,所有的信息都是关于一辆红色或蓝色的汽车...很难让我只关注数据库连接对象。
我有一种令人难以置信的怀疑,即我的__construct()不应该有连接字符串,而是它在类中的自己的方法..但它的工作原理......
如下所示定义我的连接类是不正确的..如果它错了 - 应该怎么看?
谢谢!
class dbConnect {
// Declare connection info for PDO
private $dbType = 'mysql';
private $dbHost = 'localhost';
private $dbUser = 'user';
private $dbPass = 'password';
private $dbName = 'db';
// Declare connection variable for object
private $dbConn;
// Construct object
private function __construct() {
// Create Database connection and assign it to object as dbConn
$this -> dbConn = new PDO( $this -> dbType . ':' . 'host=' . $this -> dbHost . ';' . 'dbname=' . $this -> dbName , $this -> dbUser , $this -> dbPass );
}
}
答案 0 :(得分:5)
我不认为我认为你在做什么是非常有用的。看起来你将拥有一个数据库类。我只是看不到这样做的好处,因为PDO
已经是一个类,所以没有必要扩展它,除非你有充分的理由这样做。
更好的选择imho是在bootstrap阶段初始化PDO
实例并在需要它的类中注入连接;
$dbConnection = new PDO('mysql:host=localhost;dbname=db', 'user', 'password');
$someInstance = new ClassThatNeedsDatabase($dbConnection);
$someInstance->doSomething();
class ClassThatNeedsDatabase
{
private $dbConnection ;
public function __construct(PDO $dbConnection)
{
$this->dbCOnnection = $dbConnection;
}
public function doSomething()
{
$stmt = $this->dbConnection->prepare('UPDATE....');
// etc
}
}
在一般说明中,您可能希望避免在其他类中使用new
关键字,因为它们会引入紧密耦合。这会损害可维护性(很难通过查看类签名来判断类是什么),testablity(你不能轻易地交换类)等等。如果你真的需要在其他类中构建新实例(在这个特定情况下是真的不需要如上所述的imo)你可能想要实现工厂模式:
class Foo
{
public function doSomething()
{
}
}
class FooFactory
{
public function build()
{
return new Foo();
}
}
class Bar
{
private $fooFactory;
public function __construct(FooFactory $fooFactory)
{
$this->fooFactory = $fooFactory;
}
public function soSomethingWhichNeedsToBuildAnInstance()
{
$foo = $this->fooFactory->build();
}
}
这也可以防止代码紧密耦合。
以上命名很糟糕,但这只是为了说明这一点。 : - )子> 子>
答案 1 :(得分:0)
是的,您应该extending
现有的PDO
对象。
这是你的基础:
define('DB_USER', 'username');
define('DB_PASS', 'password');
define('DB_DSN', 'dsn');
class dbConnect extends PDO {
public function __construct($user = DB_USER, $pass = DB_PASS, $dsn = DB_DSN) {
parent::__construct($dsn, $user, $pass, $options);
}
}