Así es más o menos como lo hago yo. No estoy seguro de si esta es la mejor manera de hacerlo, pero funciona para mí.
Mi clase de fábrica es el NÚCLEO de mi código. Desde aquí genero todas las clases con las que trabajo. Mi clase de fábrica se guarda en un archivo separado factory.class.php
.
Al tener una clase de fábrica, solo necesito incluir archivos de clase una sola vez. Si no tuviera esto, tendría que incluir mis archivos de clase para cada archivo que tenga que usarlo. Si necesito actualizar el nombre de un archivo de clase más tarde, solo necesito hacer la actualización en el archivo de clase de fábrica.
Otra razón para crear un objeto de fábrica fue reducir la cantidad de conexiones de base de datos.
Guardo cada clase como un archivo separado
Clase de fábrica
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()); }
}
Clase de conexión
// 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;
}
}
Diferentes objetos de clase
Estas son tus clases. Aquí es donde trabaja con sus datos. En mi propio código, estoy usando una arquitectura de tres niveles, separando la presentación de la capa comercial y la capa de objetos de datos.
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;
}
}
Haz lo mismo con tus otras clases.
Poniéndolo todo junto
Tenga en cuenta que solo incluimos un archivo, los archivos de fábrica. Todos los demás archivos de clase están incluidos en el archivo de clase de 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);