Es mas sencillo si lo realizas de la forma que te lo propongo supon que tienes una interface DB (acceso a Bases de Datos)
Tu creas tu objeto, supongamos usuarios, y tu lo usas y lo rehusas en tus proyectos, puedes evitarte instanciar codigo al hacerlo en tu constructor. Ahora supongamos que le prestas a Fulano tu clase usuarios, pero él quiere utilizar su clase DB, lo que haces ahi es decirle, ok mi clase si sirve pero necesitas que tu clase DB implemente mi clase abstracta para que no haya problemas con metodos.
Luego usas metodos estaticos para cambiar la clase que usas, te pongo un ejemplo:
Código PHP:
interface DB {
public function connect($server, $user, $pass);
}
class MySQLDB implements DB {
private $link;
public function connect( $server, $user, $pass ) {
$this->link = mysql_connect( $server, $user, $pass );
}
}
class Usuarios {
private static $dbInterface = null;
public function __construct() {
if( !isset( self::$dbInterface ) ) {
self::$dbInterface = new MySQLDB();
} else {
if( !( self::$dbInterface instanceof DB ) ) {
throw new Exception( "Database adapter must implement interface DB" );
}
}
self::$dbInterface->connect();
}
public static function setDBAdapter( DB $db ) {
self::$dbInterface = $db;
}
}
En ese ejemplo tu clase usuarios por defecto va a usar MySQL DB para realizar sus consultas, pero si en un futuro quieres usar otro adaptador solo llamas a la funcion setDBAdapter con una nueva clase DB, (puede ser MSSQL, PostgreSQL, etc.)