Jednoduché pravidlo:pokud se třída extends
jiná, pak tato třída je tato nadřazená třída (pouze mírně pozměněná nebo rozšířená). Tuto podřízenou třídu můžete absolvovat namísto nadřazené třídy. Příklad:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Funguje to, baz()
očekává Foo
ale také přijímá Bar
, protože Bar
je a Foo
.
Nyní je vaši Users
a Database
? Ne. Vaši uživatelé nejsou databáze. Vaši uživatelé používají databáze. Pokud vůbec, měli byste použít složení :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Třída by měla být jaké jsou její odpovědnosti . Odpovědností třídy správy uživatelů je správa uživatelských dat. Část toho může zahrnovat komunikaci s databází, ale to neznamená, že třída správy uživatelů je databáze. Pokud User extends Database
, to znamená, že může dělat vše, co Database
třída umí (a další). To znamená, že můžete použít User
třída všude místo Database
třídy, a to nedává smysl. Udržujte povinnosti oddělené.
Nyní je stále diskutabilní, zda je to správná struktura nebo ne, ale jde to správným směrem. Možná ale opravdu budete chtít mít User
třída, která představuje jednoho uživatele . Poté máte UserManager
nebo UserORM
nebo UserStorage
nebo cokoli jiného, co se týká získávání a ukládání User
objektů v databázi. Tato třída zase používá Database
udělat právě to. Tím jsou odpovědnosti jasné a oddělené. User
třída představuje uživatelská data, Database
třída interaguje s databází, UserORM/Manager/whatever
uprostřed vyjednává mezi těmito dvěma.