2011-09-02 32 views
7

câu hỏi Khá ngắn, đây là một ví dụ:PHP PDO: Các kiểu tìm nạp FETCH_CLASS và FETCH_INTO có tìm nạp các thuộc tính đối tượng riêng tư không?

$prepared = $this->pdo->prepare("SELECT * FROM Users WHERE ID = :ID"); 
$statement = $prepared->execute(array(":ID" => $User_ID)) 
$result = $statement->fetchAll(PDO::FETCH_CLASS, "User"); 
//OR 
$User = new User(); 
$result = $statement->fetch(PDO::FETCH_INTO, $User); 

(bằng văn bản từ đỉnh đầu, có thể chứa các lỗi cú pháp)

Do hai trực tiếp lấy vào tài sản riêng của nói đối tượng? Tôi đọc nó cũng phá vỡ các chức năng __construct, do đó, nó sẽ phá vỡ tình trạng tư nhân quá?

Trả lời

7

Câu trả lời rất ngắn: Có.

class Foo 
{ 
    private $id; 
    public function echoID() 
    { 
     echo $this->id; 
    } 
} 
$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo"); 
$result[0]->echoID(); // your ID 

Ngoài:

Điều này sẽ gây ra lỗi cú pháp $statement->fetchAll(PDO::FETCH_INTO, $User);. Bạn không thể sử dụng FETCH_INTO với phương pháp fetchAll.

+1

Ah, được rồi ... Kể từ fetchAll muốn tạo ra nhiều hơn một đối tượng này sẽ không bao giờ làm việc. Tôi hiểu rồi! – sinni800

+0

Nó sẽ không có vấn đề khi tạo các lớp, nó là FETCH_INTO sẽ không hoạt động vì bạn chỉ có thể gửi một đối tượng duy nhất làm tham số. –

+0

@Wesleay đó là những gì tôi đã đề cập đến. Tôi chỉ cho nó một ví dụ duy nhất để nó không hoạt động. – sinni800

1

Nhưng sự kiện với PDO :: FETCH_CLASS có sự cố đối với thuộc tính riêng tư cho lớp con. Ví dụ:

class Animal 
{ 
    private $color; 
    public function getColor() 
    { 
     return $this->color; 
    } 
} 
class Cat extends Animal 
{ 
} 

$statement->setFetchMode(PDO::FETCH_CLASS, "Cat"); 
$someCat = $statement->fetch(); 

echo $someCat->getColor(); //empty 
print_r($someCat); 
/* 
now have strange output like: 
[color:Animal:private] => 
[color] => grey 
*/ 

Nhưng nếu bạn thiết lập thuộc tính để bảo vệ - nó hoạt động tốt

+1

* Các thuộc tính riêng tư * chỉ thuộc về lớp và không thể được thừa kế bởi các lớp con. – crodas

0

Lý do bạn không thể truy cập vào các thuộc tính riêng trên một lớp siêu là vì những tài sản này ra khỏi phạm vi. Các lớp con không nhận các thuộc tính riêng tư của các lớp cha mẹ của chúng, bao gồm các biến và hàm.

chỉnh sửa: Cảm ơn bạn đã làm rõ câu hỏi của mình nhưng câu trả lời của tôi có vẻ hơi lố bịch ở đây. : P

0

Bạn có thể thử:

class Foo { 
    private $id; 
    public function __set($prop, $val) { 
     $this->$prop = $val; 
    } 
    public function __get($prop) { 
     return $this->$prop; 
    } 
} 

$result = $statement->fetchAll(PDO::FETCH_CLASS, "Foo"); 
$result[0]->id(); 
Các vấn đề liên quan