Así es, es totalmente correcto lo que dices.
Pues la forma es instanciando la clase donde necesites, hay muchas formas, la forma más correcta es la inyección de dependencias, es un patrón de desarrollo de Software para POO, que te permite en lugar de hardcodear la dependencia en la clase, inyectarla desde fuera de la clase para que sea usada, por ejemplo:
// no recomendado
Código PHP:
Ver originalclass User {
private $db;
public function __construct() {
$this->db = new DB(/* Datos *); // hardcoded
$this->db = Registry::get('db'); // vía registro (no recomendado tampoco)
}
}
$user = new User();
$user->algo();
// recomendado
Código PHP:
Ver originalclass User {
private $db;
public function setDb(DBInterface $db) { $this->db = $db; }
public function getDb() { return $this->db; }
}
// en otro file donde hagas el setup
$db = new Db(/* datos */);
$user = new User();
$user->setDb($db);
// Donde uses $user
$user->algo();
Todo eso se puede automatizar usando un Dependency Container que te permite "auto conectar" los objetos dependiendo de un registro de dependencias, es la forma más correcta actualmente para manejar las dependencias en Software.
Saludos.