La dependencia en los buenos diseños se da en niveles más altos de abstracción, no en una clase que trabaja a bajo nivel como una conexión a la base de datos, estarías reescribiendo PDO intentando algo así, osea, reinventando la rueda.
Lo que deben hacer tus objetos es depender de la base de datos y para eso debes inyectar esa dependencia en el constructor de esos objetos dependientes.
te pongo un ejemplo rápido:
Código PHP:
Ver original<?php
abstract class BaseDeDatos {
private $db;
function __construct(PDO $db) {
$this->db = $db;
}
protected function execute
($statement, array $args = []) { $stmt = $this->db->prepare($statement);
$stmt->execute($args);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
interface Persona {
function getNombre();
function getApellido();
}
class Usuario extends BaseDeDatos implements Persona {
function getNombre() {
return $this->execute('SELECT nombre FROM tabla_usuarios WHERE id = 1;')[0]['nombre'];
}
function getApellido() {
return $this->execute('SELECT apellido FROM tabla_usuarios WHERE id = 1;')[0]['apellido'];
}
}
interface PlantillaPersona {
function dibujar(Persona $persona);
}
class PersonaEnTabla implements PlantillaPersona {
function dibujar(Persona $persona) {
return
"<table><tr><th>Nombre</th><th>Apellido</th></tr>" .
"<tr><td>{$persona->getNombre()}</td><td>{$persona->getApellido()}</td></tr></table>";
}
}
class PersonaEnDiv implements PlantillaPersona {
function dibujar(Persona $persona) {
return
"<div><label>Nombre</label><span>{$persona->getNombre()}</span>" .
"<label>Apellido</label><span>{$persona->getApellido()}</span></div>";
}
}
// para acabar haciendo algo así (todo lo que no deberías hacer dentro de las clases):
$db = new PDO('dsn', 'user', 'pass');
$usuario = new Usuario($db);
echo "Persona dibujada en una tabla:";
echo (new PersonaEnTabla)->dibujar($usuario);
echo "Persona dibujada en una capa div:";
echo (new PersonaEnDiv)->dibujar($usuario);
Como ves la inyección de dependencia se da en la lógica de negocio (no en la conexión a la base de datos, que para eso ya esta PDO), en el nivel más alto de abstracción de tu aplicación.