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.