Supponiamo che ci siano due classi che definiscono oggetti con funzioni molto diverse in modo tale che nel datastore le informazioni richieste siano divise in due database separati.
Ad esempio, le classi Employee
e SteelExtruder
possono essere inserite rispettivamente nei database 'human_resources'
e 'capital'
. Piuttosto che codificare in modo rigido le connessioni ai rispettivi database:
class Employee {
protected $dbc;
public function __construct() {
$this->dbc = new mysqli('localhost', 'user', 'pass', 'human_resources');
}
}
Riesco a vedere i vantaggi in termini di flessibilità derivanti dall'iniezione della connessione al database nel costruttore:
class Employee {
protected $dbc;
public function __construct(mysqli $dbc) {
$this->dbc = $dbc;
}
}
Tuttavia, non riesco a vedere come implementarlo correttamente. Ho letto che i singleton e le librerie di database sono pratiche sbagliate, poiché si limitano a mascherare il fatto che sono in realtà solo variabili globali. D'altra parte, le alternative non sembrano neanche fantastiche:
A) Dichiara le connessioni necessarie a livello globale in un file del caricatore. Funzionalmente identico a una classe di libreria di database, ma ha un cattivo odore:
loader.php:
$dbc_human_resources = new mysqli('localhost', 'user', 'pass', 'human_resources');
$dbc_capital = new mysqli('localhost', 'user', 'pass', 'capital');
index.php:
$employees = array(
new Employee($dbc_human_resources),
new Employee($dbc_human_resources),
...
);
B) Crea una nuova connessione ogni volta che viene creato un nuovo oggetto. A meno che non ci sia un qualche tipo di ottimizzazione di cui non sono a conoscenza, questo sembra incurantemente inefficiente.
$employees = array(
new Employee(new mysqli('localhost', 'user', 'pass', 'human_resources')),
new Employee(new mysqli('localhost', 'user', 'pass', 'human_resources')),
...
);
C) Archivia tutti gli oggetti in un oggetto libreria che richiede una singola connessione, che non sembra così male ma che si sente sbagliato:
Employee.php:
class Employee {
//non-database properties
public function __construct($args = array()) {
//non-database initialization
}
}
EmployeeLibrary.php:
class EmployeeLibrary {
protected $dbc, $employees;
public function __construct(mysqli $dbc) {
$this->dbc = $dbc;
}
public function add_new_employee($args) {
array_push($this->employees, new Employee($args));
}
//do things with database connection
}
loader.php:
$employee_library = new EmployeeLibrary(new mysqli('localhost', 'user', 'pass', 'human_resources');
index.php:
$employee_library->add_new_employee(...);
$employee_library->add_new_employee(...);
Sono sicuro che questo non è un problema raro. C'è un modo accettato per farlo?