sql >> Base de Datos >  >> RDS >> Mysql

¿Es una buena práctica extender las clases?

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.