PDO class 使用链式方法
PDO class use chain method
这是我的 "wrapper" class,在 PDO 之上(它更大,这是现在的重要部分)
class DB
{
protected $pdo;
protected $dsn;
protected $username;
protected $password;
protected $driverOptions;
protected $query;
public function __construct($dsn, $username = '', $password = '', array $driverOptions = [])
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->driver_options = $driverOptions;
}
public function connect()
{
$this->pdo = new PDO($this->dsn, $this->username, $this->password, (array)$this->driver_options);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $this->pdo;
}
public function myQuery($sql)
{
$this->query = $this->pdo->prepare($sql);
$this->query->execute();
return $this->query;
}
public function all()
{
$all = $this->query->fetchAll();
$this->query->closeCursor();
return $all;
}
}
这很完美(如果稍作改动,特别是通过添加类型提示),例如:
$class = new myPDO('mysql:host=localhost;dbname=***', 'login', 'pass');
$prepare = $class->connect()->prepare('SELECT * FROM test');
$prepare->execute();
$result = $prepare->fetch();
但我想这样使用它:
$pdo = new DB('mysql:host=localhost;dbname=***', 'login', 'pass');
$result = $pdo->connect()->myQuery('SELECT * FROM test')->all();
我的 IDE 中出现了这个错误:
Method 'myQuery' not found in class PDO
你的 class 是对 PDO 的抽象,但你在写这个时泄漏了实际的 PDO 对象:
return $this->pdo;
这个 class 的消费者永远不需要知道那个对象的存在,所以你不应该把它给他们。
要获得链接效果,您所要做的就是将调用者返回他们已经拥有的对象,以准备进行下一次调用。换句话说:
return $this;
这是我的 "wrapper" class,在 PDO 之上(它更大,这是现在的重要部分)
class DB
{
protected $pdo;
protected $dsn;
protected $username;
protected $password;
protected $driverOptions;
protected $query;
public function __construct($dsn, $username = '', $password = '', array $driverOptions = [])
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->driver_options = $driverOptions;
}
public function connect()
{
$this->pdo = new PDO($this->dsn, $this->username, $this->password, (array)$this->driver_options);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $this->pdo;
}
public function myQuery($sql)
{
$this->query = $this->pdo->prepare($sql);
$this->query->execute();
return $this->query;
}
public function all()
{
$all = $this->query->fetchAll();
$this->query->closeCursor();
return $all;
}
}
这很完美(如果稍作改动,特别是通过添加类型提示),例如:
$class = new myPDO('mysql:host=localhost;dbname=***', 'login', 'pass');
$prepare = $class->connect()->prepare('SELECT * FROM test');
$prepare->execute();
$result = $prepare->fetch();
但我想这样使用它:
$pdo = new DB('mysql:host=localhost;dbname=***', 'login', 'pass');
$result = $pdo->connect()->myQuery('SELECT * FROM test')->all();
我的 IDE 中出现了这个错误:
Method 'myQuery' not found in class PDO
你的 class 是对 PDO 的抽象,但你在写这个时泄漏了实际的 PDO 对象:
return $this->pdo;
这个 class 的消费者永远不需要知道那个对象的存在,所以你不应该把它给他们。
要获得链接效果,您所要做的就是将调用者返回他们已经拥有的对象,以准备进行下一次调用。换句话说:
return $this;