2011-09-02 13 views
7

piuttosto breve domanda, ecco un esempio:PHP PDO: gli stili di recupero FETCH_CLASS e FETCH_INTO prelevano nelle proprietà degli oggetti privati?

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

(scritta dalla parte superiore della testa, potrebbero contenere errori di sintassi)

fare quelle due fetch direttamente nelle privati ​​ proprietà di detti oggetti? L'ho letto anche per aggirare la funzione __construct, quindi eluderà anche lo stato privato?

risposta

7

Risposta molto breve: Sì lo sarà.

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

parte:

Ciò causerà errori di sintassi $statement->fetchAll(PDO::FETCH_INTO, $User);. Non è possibile utilizzare FETCH_INTO con il metodo fetchAll.

+1

Ah, va bene ... Dal momento che fetchAll vuole creare più di un oggetto questo non funzionerà mai. Capisco! – sinni800

+0

Non avrà problemi a creare le classi, è FETCH_INTO che non funzionerà poiché è possibile inviare un solo oggetto come parametro. –

+0

@Wesleay è quello a cui mi riferivo. Gli do solo una singola istanza, quindi non funziona. – sinni800

1

Ma l'evento con PDO :: FETCH_CLASS presenta un problema per le proprietà private per le sottoclassi. 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 
*/ 

Ma se si imposta la proprietà a protetto - funziona benissimo

+1

* Le proprietà private * appartengono solo alla classe e non possono essere ereditate dalle sottoclassi. – crodas

0

La ragione per cui non è possibile accedere alle proprietà private su una super classe è perché queste proprietà sono fuori portata. Le sottoclassi non assumono gli attributi privati ​​delle loro classi genitore, comprese variabili e funzioni.

modifica: Grazie per aver chiarito la tua domanda ma la mia risposta sembra un po 'ridicola qui. : P

0

si potrebbe provare:

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