Mniej więcej tak to robię. Nie jestem pewien, czy jest to najlepszy sposób na zrobienie tego, ale dla mnie działa.
Moja klasa fabryczna jest rdzeniem mojego kodu. Stąd generuję wszystkie klasy, z którymi pracuję. Moja klasa fabryczna jest zapisana w osobnym pliku factory.class.php
.
Mając klasę fabryczną, wystarczy dołączyć pliki klas tylko raz. Gdybym tego nie miał, musiałbym dołączyć moje pliki klas dla każdego pliku, który musi z niego korzystać. Jeśli muszę później zaktualizować nazwę pliku klasy, wystarczy dokonać aktualizacji w fabrycznym pliku klasy.
Innym powodem utworzenia obiektu fabryki było zmniejszenie liczby połączeń DB.
Zapisuję każdą klasę jako osobny plik
Klasa fabryczna
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()); }
}
Klasa połączenia
// 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;
}
}
Różne obiekty klas
To są twoje zajęcia. Tutaj pracujesz ze swoimi danymi. W moim własnym kodzie używam architektury trójwarstwowej, oddzielającej prezentację od warstwy biznesowej i warstwy obiektów danych.
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;
}
}
Zrób to samo dla innych swoich zajęć.
Łączenie wszystkiego w całość
Zauważ, że dołączamy tylko jeden plik, pliki fabryczne. Wszystkie inne pliki klas są zawarte w pliku klasy 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);