Einfache Faustregel:wenn eine Klasse extends
wird eine andere, dann ist diese Klasse dieser Elternklasse (nur leicht verändert oder erweitert). Sie können diese untergeordnete Klasse anstelle der übergeordneten Klasse bestehen. Beispiel:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Das funktioniert, baz()
erwartet ein Foo
akzeptiert aber auch einen Bar
, weil Bar
ist ein Foo
.
Nun, ist Ihre Users
eine Database
? Nein. Ihre Benutzer sind keine Datenbank. Ihre Benutzer verwenden eine Datenbank. Wenn überhaupt, sollten Sie composition verwenden :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Eine Klasse sollte sein was seine Verantwortlichkeiten sind . Die Verantwortung einer Benutzerverwaltungsklasse besteht darin, Benutzerdaten zu verwalten. Ein Teil davon kann die Kommunikation mit einer Datenbank beinhalten, aber das bedeutet nicht, dass die Benutzerverwaltungsklasse ist eine Datenbank. Wenn User extends Database
, das heißt, es kann alles, was die Database
kann Klasse kann (und mehr). Das heißt, Sie könnten den Users
verwenden Klasse überall statt die Database
Klasse, und das macht keinen Sinn. Halten Sie Verantwortlichkeiten getrennt.
Ob das nun die richtige Struktur ist, darüber lässt sich noch streiten, aber es geht in die richtige Richtung. Aber vielleicht möchten Sie wirklich einen Users
haben Klasse, die einen Benutzer darstellt . Sie haben dann einen UserManager
oder UserORM
oder UserStorage
oder was auch immer, das sich mit dem Abrufen und Speichern von User
befasst Objekte in einer Datenbank. Diese Klasse wiederum benutzt eine Database
genau das zu tun. Das hält die Verantwortlichkeiten klar und getrennt. Der Users
Klasse repräsentiert Benutzerdaten, die Database
Klasse interagiert mit der Datenbank, dem UserORM/Manager/whatever
in der Mitte verhandelt zwischen den beiden.