Regla general simple:si una clase extends
otra, entonces esa clase es esa clase principal (solo ligeramente modificada o ampliada). Puede pasar esta clase secundaria en lugar de la clase principal. Ejemplo:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Esto funciona, baz()
espera un Foo
pero también acepta una Bar
, porque Bar
es un Foo
.
Ahora, es tus Users
una Database
? No. Tus usuarios no son una base de datos. Tus usuarios usan una base de datos En todo caso, deberías usar composición :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Una clase debería ser cuáles son sus responsabilidades son . La responsabilidad de una clase de gestión de usuarios es gestionar los datos de los usuarios. Parte de eso puede implicar hablar con una base de datos, pero eso no significa que la clase de administración de usuarios es una base de datos Si User extends Database
, eso significa que puede hacer todo lo que la Database
la clase puede hacer (y más). Eso significa que podría usar el User
clase en todas partes en lugar de la Database
clase, y eso no tiene ningún sentido. Mantenga las responsabilidades separadas.
Ahora, todavía es discutible si esa es la estructura correcta o no, pero va en la dirección correcta. Pero es posible que realmente desee tener un User
clase, que representa un usuario . Entonces tienes un UserManager
o UserORM
o UserStorage
o lo que sea, que se ocupa de recuperar y almacenar User
objetos en una base de datos. Esta clase a su vez usa una Database
para hacer precisamente eso. Eso mantiene las responsabilidades claras y separadas. El User
clase representa los datos del usuario, la Database
class interactúa con la base de datos, el UserORM/Manager/whatever
en el medio negocia entre los dos.