2012-01-17 36 views
9

Tôi có một lớp học sử dụng các phương pháp ma thuật để lưu trữ các thuộc tính. Dưới đây là một ví dụ đơn giản:Sử dụng PDO :: FETCH_CLASS với các phương pháp ma thuật

class Foo { 
    protected $props; 

    public function __construct(array $props = array()) { 
     $this->props = $props; 
    } 

    public function __get($prop) { 
     return $this->props[$prop]; 
    } 

    public function __set($prop, $val) { 
     $this->props[$prop] = $val; 
    } 
} 

Tôi đang cố gắng để nhanh chóng đối tượng của lớp này cho mỗi hàng cơ sở dữ liệu của một PDOStatement sau khi nó được thực hiện, như thế này (không hoạt động):

$st->setFetchMode(PDO::FETCH_CLASS, 'Foo'); 

foreach ($st as $row) { 
    var_dump($row); 
} 

Vấn đề là PDO::FETCH_CLASS dường như không kích hoạt phương thức ma thuật __set() trên lớp của tôi khi nó thiết lập các giá trị thuộc tính.

Làm cách nào để hoàn thành hiệu ứng mong muốn bằng PDO?

+1

bản sao có thể có của [PHP PDO: Tìm nạp dữ liệu dưới dạng đối tượng - thuộc tính được gán trước khi __construct được gọi. Điều này có đúng không?] (Http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

Trả lời

12

Hành vi mặc định của PDO là đặt thuộc tính trước khi gọi hàm tạo. Bao gồm PDO::FETCH_PROPS_LATE trong bitmask khi bạn đặt chế độ tìm nạp để đặt thuộc tính sau khi gọi hàm tạo, điều này sẽ gây ra phương thức ma thuật __set được gọi trên thuộc tính không xác định.

$st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo'); 

Hoặc, tạo một thể hiện và tìm nạp nó (ví dụ: đặt chế độ tìm nạp thành PDO::FETCH_INTO).

+1

Cảm ơn bạn, công trình này. Ngoài sự tò mò, liệu có một lợi ích hiệu suất để thiết lập chúng trước khi gọi hàm tạo không? Tôi không hiểu tại sao 'PDO :: FETCH_PROPS_LATE' sẽ không phải là hành vi mặc định ... – FtDRbwLXw6

+0

@drrcknlsn: cho nhiều" lý do "? như có, xem câu hỏi khác. Lưu ý rằng nhận xét không dành cho các câu hỏi bổ sung ngoài yêu cầu làm rõ. – outis

+1

Tôi đã đọc liên kết bạn đã dán, nhưng không có câu trả lời cho lý do tại sao đây là hành vi mặc định. Tôi hỏi điều này trong các ý kiến ​​bởi vì nó không đủ quan trọng để đảm bảo mở một câu hỏi mới, IMO, nhưng tôi vẫn muốn biết. – FtDRbwLXw6

Các vấn đề liên quan