1) I would create the database object once in my main code and pass a reference to it to any other classes they may need to use a db connection.
2) I would move the actual connecting of the database out of the contruct and put into a child function.
3) this would be a non issue.
Code may look something like this.
$mydbobject = new database($server,$user,$pass,$database,$prefix = ''); // create a database object.
$mydbobject->connect(); // connection member funtion inside database class only called once.
$myuserobject = new user(); // create a user object.
$login = $user->login($name, $pass, $mydbojbect); // call member function login of user class and do login logic. In this example it would return some message.
There are many ways to go about it just try to think of a class as an object. There is nothing wrong with an object using another object. I'm sure you have read about the popular bicycle example when reading about OOP. Imagine if you also had a surface object, it could be a road, dirt trail, grass field, ect.. You wouldn't have the bicycle extend the surface object in order to move on it.