2011-09-02 8 views
7

Dość krótkie pytanie, oto przykład:PHP PDO: Czy style pobierania FETCH_CLASS i FETCH_INTO przechodzą do właściwości obiektu prywatnego?

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

(napisany od czubka głowy, mogą zawierać błędy składniowe)

Czy te dwa bezpośrednio sprowadzić do prywatnych właściwości tych przedmiotów? Czytałem, że omija również funkcję __construct, więc czy obejdzie również prywatny status?

Odpowiedz

7

Bardzo krótka odpowiedź: tak.

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

marginesie:

To spowoduje błędy składniowe $statement->fetchAll(PDO::FETCH_INTO, $User);. Nie można użyć metody FETCH_INTO za pomocą metody fetchAll.

+1

Ach, dobrze ... Od fetchAll chce stworzyć więcej niż jeden obiekt ten nigdy nie będzie działać. Rozumiem! – sinni800

+0

Nie będzie problemu z tworzeniem klas, to FETCH_INTO nie będzie działać, ponieważ możesz wysłać tylko jeden obiekt jako parametr. –

+0

@W dniu w którym to właśnie miałem na myśli. Podaję tylko jedną instancję, więc nie działa. – sinni800

1

Ale zdarzenie z PDO :: FETCH_CLASS powoduje problem z prywatnymi właściwościami podklas. E.g.

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

Ale jeśli ustawić właściwość do chroniony - to działa dobrze

+1

* Prywatne * właściwości należą wyłącznie do klasy i nie mogą być dziedziczone przez podklasy. – crodas

0

Powodem nie może uzyskać dostępu do właściwości prywatnych na super klasy jest, ponieważ te właściwości są poza zakresem. Podklasy nie biorą na siebie prywatnych atrybutów ich klas macierzystych, w tym zmiennych i funkcji.

edytuj: Dziękuję za wyjaśnienie pytania, ale moja odpowiedź wygląda tu trochę śmiesznie. : P

0

Można spróbować:

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