2010-07-21 6 views
7

Je veux remplir la classe avec le constructeur en utilisant FETCH_INTO des AOP:

class user 
{ 
    private $db; 
    private $name; 

    function __construct($id) 
    { 
     $this->db = ...; 

     $q = $this->db->prepare("SELECT name FROM users WHERE id = ?"); 
     $q->setFetchMode(PDO::FETCH_INTO, $this); 
     $q->execute(array($id)); 

     echo $this->name; 
    } 
} 

Cela ne fonctionne pas. Pas d'erreur, juste rien. Script n'a pas d'erreurs, FETCH_ASSOC fonctionne très bien.

Quel est le problème avec FETCH_INTO?

+0

Je suis récemment allé à travers cette façon de définir des objets, pour moi en utilisant PDO et la méthode d'extraction pour remplir des objets est que je pouvais voir le plus pratique. – user544262772

Répondre

14

Vous avez deux erreurs dans votre code:

1) Vous avez oublié q- $> fetch()

... 
$q->execute(array($id)); 
$q->fetch(); // This line is required 

2) Mais même après avoir ajouté $ q-> fetch(), vous obtenez ceci:

Fatal error: Cannot access private property User::$name in ...

donc, comme vous pouvez le voir, AOP ne peut pas accéder aux membres privés, même si elle est appelée à l'intérieur méthode de classe.

Voici ma solution:

... 
$q->execute(array($id)); 
$q->setFetchMode(PDO::FETCH_ASSOC); 
$data = $q->fetch(); 
foreach ($data as $propName => $propValue) 
{ 
    // here you can add check if class property exists if you don't want to 
    // add another properties with public visibility 
    $this->{$propName} = $propValue; 
} 
+2

Vous pouvez également rendre '$ name' une variable publique. Cela ressemble sûrement à un. – Matchu

+3

L'ajout de propriétés publiques n'est pas toujours une bonne idée – Serg

+0

+ cet exemple était super utile – Nathan

Questions connexes