2011-09-02 43 views
7

很短的問題,這裏有一個例子:PHP PDO:提取樣式FETCH_CLASS和FETCH_INTO是否獲取私有對象屬性?

$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); 

(從頭部的頂部開始寫,可能含有語法錯誤)

做那些兩個直接讀取到的私人性質說的對象? 我讀過它也規避了__construct函數,那麼它是否也會繞過私有狀態呢?

回答

7

很簡短的回答:是的,它會。

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

旁白:

這將導致語法錯誤$statement->fetchAll(PDO::FETCH_INTO, $User);。您不能使用FETCH_INTOfetchAll方法。

+1

啊,好吧......既然使用fetchall希望創建多個對象,這將不會起作用。我知道了! – sinni800

+0

創建類沒有任何問題,它是FETCH_INTO,因爲只能將單個對象作爲參數發送,所以不起作用。 –

+0

@Wesleay這就是我所指的。我只給它一個實例,所以它不起作用。 – sinni800

1

但是,對於PDO :: FETCH_CLASS事件,子類的私有屬性存在問題。 例如

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 
*/ 

但是,如果你的屬性設置爲保護 - 它工作得很好

+1

* Private *屬性僅屬於該類,不能由子類繼承。 – crodas

0

的原因,你不能在一個超類訪問私有財產是因爲這些屬性是超出範圍。子類不承擔其父類的私有屬性,包括變量和函數。

編輯:謝謝澄清你的問題,但它確實使我的答案看起來有點荒謬在這裏。 :P

0

你可以嘗試:

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();