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.