【发布时间】:2011-03-26 18:27:43
【问题描述】:
是否可以扩展 PHP PDO 语句类来添加自定义方法?这与扩展基本 PDO 类不同。如果是这样,由于仅在通过 PDO 类运行查询时才返回语句类,因此如何做呢?
【问题讨论】:
是否可以扩展 PHP PDO 语句类来添加自定义方法?这与扩展基本 PDO 类不同。如果是这样,由于仅在通过 PDO 类运行查询时才返回语句类,因此如何做呢?
【问题讨论】:
你可以用PDO::setAttribute()设置类:
PDO::ATTR_STATEMENT_CLASS:设置派生自 PDOStatement 的用户提供的语句类。不能与持久 PDO 实例一起使用。需要数组(字符串类名,数组(混合构造函数_args))。
例子:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, [Custom::class]);
【讨论】:
array($pdo))。此外,对于命名空间中的使用,您可以使用 Custom::class 而不是 'Custom',这会为您提供符合当前 use 导入的完全限定类名称。
如果你为你的类使用命名空间,你需要在你的类字符串中添加一个反斜杠。
没有命名空间:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Custom', array($pdo)));
带命名空间:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Namespace\Custom', array($pdo)));
【讨论】:
这是我将选择查询的结果作为插入语句保存到文本文件中的代码。 我首先扩展 PDOStatement 类,添加自定义方法 saveResultAsInsertStatement:
<?php
class MyPDOStatement extends PDOStatement {
protected $pdo;
protected function __construct($pdo) {
$this->pdo = $pdo;
}
public function saveResultAsInsertStatement($filename) {
$result = '';
$columnData = $this->fetchAll(PDO::FETCH_ASSOC);
if ($columnData != null) {
$fieldCount = count($columnData[0]);
$rowsCount = count($columnData);
$columnsName = array_keys($columnData[0]);
$result = "INSERT INTO %s ( \n";
$result .= join(",\n", $columnsName);
$result .= ") VALUES\n";
$r = 0;
foreach ($columnData as $row) {
$result .= "(";
$c = 0;
foreach ($row as $key => $field) {
$result .= $this->pdo->quote($field);
$result .= ( ++$c < $fieldCount) ? ', ' : '';
}
$result .= ")";
$result .= ( ++$r < $rowsCount) ? ',' : '';
$result .= "\n";
}
}
$f = fopen($filename, "w");
fwrite($f, $result);
fclose($f);
}
}
?>
然后我扩展 PDO 类来设置属性 PDO::ATTR_STATEMENT_CLASS
<?php
class MyPDO extends PDO {
public function __construct(... PDO constructor parameters here ... ) {
parent::__construct( ... PDO construct parameters here ...);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this)));
}
}
?>
那么,我可以写:
<?php
$conn = new MyPDO(... PDO constructor parameters here ...);
$sql = ... your select statement here...
$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
?>
【讨论】:
这是由用户在 PDO 下的 PHP 手册中回答的:
class Database extends PDO {
function __construct($dsn, $username="", $password="", $driver_options=array()) {
parent::__construct($dsn,$username,$password, $driver_options);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', array($this)));
}
}
class DBStatement extends PDOStatement {
public $dbh;
protected function __construct($dbh) {
$this->dbh = $dbh;
}
}
你可以在这个页面搜索:'smileaf'找到他的原始答案:https://php.net/manual/en/book.pdo.php
【讨论】: