Có thể mở rộng lớp tuyên bố PHP PDO để thêm các phương thức tùy chỉnh vào nó không? Điều này sẽ khác với việc mở rộng lớp PDO cơ bản. Nếu vậy, làm thế nào sẽ đi về làm điều đó kể từ khi lớp tuyên bố chỉ trả lại khi chạy truy vấn thông qua lớp PDO?Mở rộng Lớp tuyên bố PDO
Trả lời
Bạn có thể thiết lập các lớp học với PDO::setAttribute()
:
PDO :: ATTR_STATEMENT_CLASS: Đặt lớp tuyên bố người dùng cung cấp có nguồn gốc từ PDOStatement. Không thể được sử dụng với các cá thể PDO liên tục. Yêu cầu mảng (chuỗi classname, mảng (constructor_args hỗn hợp)).
Ví dụ:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Custom', array($pdo)));
này được trả lời bởi một người dùng trong Manual PHP dưới PDO:
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;
}
}
Bạn có thể tìm thấy câu trả lời ban đầu của mình bằng cách tìm kiếm: 'smileaf' tại trang này : https://php.net/manual/en/book.pdo.php
Đây là mã của tôi để lưu kết quả của truy vấn chọn vào tệp văn bản dưới dạng câu lệnh chèn. đầu tiên tôi mở rộng các lớp PDOStatement để thêm phương pháp tùy chỉnh 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);
}
}
?>
Sau đó, tôi mở rộng các lớp PDO để thiết lập các thuộc tính 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)));
}
}
?>
Vì vậy, sau đó, tôi có thể viết:
<?php
$conn = new MyPDO(... PDO constructor parameters here ...);
$sql = ... your select statement here...
$conn->query($sql)->saveResultAsInsertStatement(... name of the file here ...);
?>
- 1. Tuyên bố chuẩn bị PDO, được sử dụng chính xác?
- 2. Tuyên bố, tuyên bố, tuyên bố
- 3. Bạn có bao bọc PDO hoặc mở rộng nó không?
- 4. khai báo proporder trên lớp mở rộng
- 5. PHP - mở rộng phương pháp như mở rộng một lớp
- 6. Lớp động mở rộng
- 7. Javascript mở rộng lớp
- 8. Mở rộng nhiều lớp
- 9. Mở rộng PDO PHP không có sẵn là dòng lệnh
- 10. PDO tuyên bố không có ngoại lệ, mặc dù nó nằm bên trong khối try/catch?
- 11. CakePHP, mở rộng và bố trí
- 12. Bố cục mở rộng hoạt ảnh
- 13. Lớp mở rộng Application ném ClassNotFoundException
- 14. Bật "Tuyên bố mở" trong Aptana Studio 3 PHP Editor
- 15. phương pháp mở rộng để mở rộng lớp tĩnh
- 16. IF Tuyên bố nhiều điều kiện, cùng một tuyên bố
- 17. Làm thế nào tôi có thể xem một Bản Tuyên Bố PDO SQL chuẩn bị
- 18. Cập nhật MySQL bằng PDO và tuyên bố chuẩn bị không hoạt động
- 19. SELECT tuyên bố trong JAVA
- 20. Cách mở rộng lớp css
- 21. Mở rộng Groovy lớp String
- 22. Lớp mở rộng là gì?
- 23. lớp bên trong mở rộng
- 24. tuyên bố một trường hợp const của một lớp
- 25. Tuyên bố thuộc tính lớp: riêng tư và công khai
- 26. C++ lớp lồng nhau tuyên bố mong lỗi
- 27. Phần mở rộng PDO là cần thiết cho bộ chuyển đổi này, nhưng phần mở rộng không được tải
- 28. WPF DialogResult tuyên bố?
- 29. Tuyên bố Sql - goto
- 30. Tuyên bố GTK
Lưu ý rằng hàm tạo mặc định không mất rguments (do đó không có 'mảng ($ pdo)' ở đó). Hơn nữa, để sử dụng trong một không gian tên, bạn có thể sử dụng 'Custom :: class' thay vì' 'Custom'', nó cung cấp cho bạn tên lớp đầy đủ, tôn trọng việc nhập 'use' hiện tại. – bodo