C'est plus ou moins comme ça que je fais. Je ne sais pas si c'est la meilleure façon de procéder, mais cela fonctionne pour moi.
Ma classe d'usine est le NOYAU de mon code. À partir de là, je génère toutes les classes avec lesquelles je travaille. Ma classe d'usine est enregistrée dans un fichier séparé factory.class.php
.
En ayant une classe d'usine, je n'ai besoin d'inclure les fichiers de classe qu'une seule fois. Si je n'avais pas cela, je devrais inclure mes fichiers de classe pour chaque fichier devant l'utiliser. Si j'ai besoin de mettre à jour un nom de fichier de classe ultérieurement, je n'ai qu'à effectuer la mise à jour dans le fichier de classe d'usine.
Une autre raison de créer un objet usine était de réduire le nombre de connexions à la base de données.
J'enregistre chaque classe dans un fichier séparé
Classe Usine
include_once('person.class.php');
include_once('tracking.class.php');
include_once('costAnalyzis.class.php');
include_once('activity.class.php');
class Factory {
function new_person_obj($id = NULL) { return new Person(Conn::get_conn(), $id); }
function new_tracking_obj($id = NULL) { return new Tracking(Conn::get_conn(), $id); }
function new_costAnalyzis_obj() { return new CostAnalyzis(Conn::get_conn()); }
function new_activity_obj() { return new Activity(Conn::get_conn()); }
}
Classe de connexion
// I have this class in the same file as Factory class
// This creates DB connection and returns any error messages
class Conn {
private static $conn = NULL;
private function __construct() {}
private static function init() {
$conf = self::config();
try {
self::$conn = new PDO($conf['dsn'], $conf['user'], $conf['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (PDOException $e) {
// We remove the username if we get [1045] Access denied
if (preg_match("/\b1045\b/i", $e->getMessage()))
echo "SQLSTATE[28000] [1045] Access denied for user 'name removed' @ 'localhost' (using password: YES)";
else
echo $e->getMessage();
}
}
public static function get_conn() {
if (!self::$conn) { self::init(); }
return self::$conn;
}
// I used to get login info from config file. Now I use Wordpress constants
private static function config() {
$conf = array();
$conf['user'] = DB_USER; //$config['db_user'];
$conf['pass'] = DB_PASSWORD; //$config['db_password'];
$conf['dsn'] = 'mysql:dbname='.DB_NAME.';host='.DB_HOST;
return $conf;
}
}
Différents objets de classe
Ce sont vos cours. C'est là que vous travaillez avec vos données Dans mon propre code, j'utilise une architecture à trois niveaux, séparant la présentation, de la couche métier et de la couche objet de données.
class Person extends PersonDAO {
function getPersonData($id) {
$result = parent::getPersonData($id);
// Here you can work with your data. If you do not need to handle data, just return result
return $result;
}
}
// I only have SQL queries in this class and I only return RAW results.
class PersonDAO {
// This variable is also available from you mother class Person
private $db;
// Constructor. It is automatically fired when calling the function.
// It must have the same name as the class - unless you define
// the constructor in your mother class.
// The &$db variable is the connection passed from the Factory class.
function PersonDAO (&$db) {
$this->db = &$db;
}
public function get_data($id) {
$sql ="SELECT a, b, c
FROM my_table
WHERE id = :id";
$stmt = $this->db->prepare($sql);
$stmt->execute(array(':id'=> $id));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
public function get_some_other_data() {
$sql ="SELECT a, b, c
FROM my_table_b";
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
}
Faites de même pour vos autres classes.
Tout mettre ensemble
Notez que nous n'incluons qu'un seul fichier, les fichiers d'usine. Tous les autres fichiers de classe sont inclus dans le fichier de classe Factory.
// Include factory file
include_once('factory.class.php');
//Create your factory object
$person = Factory::new_person_obj();
//Get person data
$data = $person->getPersonData('12');
// output data
print_r($data);