web-dev-qa-db-fra.com

AOP PHP Aller chercher classe

J'apprends pdo en php, afin de rendre l'accès à la base de données plus facile et plus efficace. Une explication que j'ai lue pour fetch _class est que les propriétés de votre objet sont définies AVANT que le constructeur soit appelé. Qu'est-ce que cela signifie? Toute direction est grandement appréciée.

40
Aditya Shukla

Cela signifie que lorsque vous utilisez PDO pour renvoyer un résultat dans un objet personnalisé, vous devez définir les variables de membre correspondant aux clés de résultat de la requête.

tel que:

class User
{
    //Predefine Here
    public $id;
    public $username;
    public $password;
    public $email;
    public $hash;

    public function profileLink()
    {
         return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username);
    }
}

$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
    echo $user->profileLink();
}

De cette façon, PDO peut définir les variables sur l'objet en dehors de sa portée interne.

si votre classe d'utilisateurs était comme ça:

class User
{
}

alors PDO ne serait pas en mesure de définir les valeurs hors de la portée, car aucune propriété n'est définie.

41
RobertPitt

Disons que vous avez cet extrait de code

<?php
class Foo {
    public $bar;

    public function __construct()
    {
        $this->bar = 1;
    }
}

$stmt = $dbh->prepare("SELECT bar FROM foo");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Foo'); 
$stmt->execute();
$obj = $stmt->fetch()
?>

La propriété de barre pour $ obj sera définie sur "1" et non sur ce qui est extrait de la base de données.

Si vous souhaitez définir le résultat de la base de données au lieu de "1", vous pouvez modifier le mode de récupération en

$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo'); 

Cela provoque l'appel du constructeur avant d'affecter les résultats aux propriétés

32
Kris

En regardant PDO :: FETCH_CLASS, vous n'avez pas vraiment besoin de définir les variables comme publiques ou privées (à partir de PHP 7.0), vous pouvez définir une classe vide et PHP PDO renseignera les attributs as $ Class-> attribut même s’ils ne sont pas définis.

c'est très utile car vous pouvez réutiliser des classes avec plusieurs requêtes traitant la même table mais pouvant renvoyer des colonnes différentes

3
Juan Vilar

Au lieu d'utiliser: FetchAll(PDO::FETCH_CLASS, 'classname')Vous pouvez utiliser: fetchObject('classname')

Exemple:

class Car extends DatabaseTable {

const TABLE_NAME = 'cars';

// Table Columns
private $color;
private $brand;
private $type;

public function __construct($pdo, $id = false)
{
    parent::__construct($pdo, TABLE_NAME, $id);
}

public static function getAll($pdo, $order = 'id') {
    $query =   'SELECT * FROM ' . self::TABLE_NAME . ' 
                ORDER BY ' . $order;

    $statement = $pdo->prepare($query);

    $objects = [];
    while ($obj = $statement->fetchObject(self::class, [$pdo])) {
        $objects[$obj->getId()] = $obj;
    }
    return $objects;
}

Le constructeur parent définit simplement ses 3 propriétés telles que: $this->id = $id;

0
Halfacht