Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy przedłużanie zajęć jest dobrą praktyką?

Prosta zasada:jeśli klasa extends inny, to ta klasa jest ta klasa rodzicielska (tylko nieznacznie zmieniona lub rozszerzona). Możesz przekazać tę klasę podrzędną zamiast klasy nadrzędnej. Przykład:

class Foo { }

class Bar extends Foo { }

function baz(Foo $foo) { }

baz(new Bar);

To działa, baz() oczekuje Foo ale akceptuje również Bar , ponieważ Bar jest Foo .

Teraz jest twoi Users Database ? Nie. Twoi użytkownicy nie są bazą danych. Twoi użytkownicy używają bazę danych. Jeśli w ogóle, powinieneś użyć kompozycji :

class User {

    protected $database;

    public function __construct(Database $database) {
        $this->database = $database;
    }

}

Klasa powinna być jakie są jego obowiązki . Zadaniem klasy zarządzania użytkownikami jest zarządzanie danymi użytkownika. Częścią tego może być rozmowa z bazą danych, ale to nie znaczy, że klasa zarządzania użytkownikami jest bazę danych. Jeśli User extends Database , co oznacza, że ​​może zrobić wszystko, co Database klasa może zrobić (i więcej). Oznacza to, że możesz użyć User klasa wszędzie zamiast Database klasę, a to nie ma sensu. Oddziel obowiązki.

Teraz nadal jest dyskusyjne, czy to właściwa struktura, czy nie, ale idzie w dobrym kierunku. Ale naprawdę możesz chcieć mieć User klasa, która reprezentuje jednego użytkownika . Masz wtedy UserManager lub UserORM lub UserStorage lub cokolwiek, co dotyczy pobierania i przechowywania User obiekty w bazie danych. Ta klasa z kolei używa Database właśnie to zrobić. Dzięki temu obowiązki są jasne i rozdzielone. User klasa reprezentuje dane użytkownika, Database klasa współdziała z bazą danych, UserORM/Manager/whatever w środku negocjuje między nimi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy atrybut może wyznaczać jedną tabelę zamiast drugiej?

  2. Całkowita liczba blokad przekracza rozmiar tabeli blokad

  3. MYSQL pokazuje 0, nawet jeśli wyniki nie istnieją

  4. MySQL 5.6.10 InnoDB nie może utworzyć tabeli, ponieważ tabela już istnieje

  5. Łączenie Doctrine DQL na kolumnach dopuszczających wartość null