Просто правило:ако клас extends
друг, тогава този клас е този родителски клас (само леко променен или разширен). Можете да предадете този дъщерен клас вместо родителския клас. Пример:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Това работи, baz()
очаква Foo
но също така приема Bar
, защото Bar
е a Foo
.
Сега, е вашите Users
a Database
? Не. Вашите потребители не са база данни. Вашите потребители използват база данни. Ако изобщо, трябва да използвате композиция :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Един клас трябва да бъде какви са неговите отговорности е . Отговорността на класа за управление на потребители е да управлява потребителски данни. Част от това може да включва разговор с база данни, но това не означава, че класът за управление на потребителите е база данни. Ако User extends Database
, което означава, че може да прави всичко, което Database
клас може да направи (и повече). Това означава, че можете да използвате User
клас навсякъде вместо Database
клас, а това няма никакъв смисъл. Дръжте отговорностите разделени.
Сега все още е спорно дали това е правилната структура или не, но тя върви в правилната посока. Но може наистина да искате да имате User
клас, който представлява един потребител . След това имате UserManager
или UserORM
или UserStorage
или каквото и да е, което се занимава с извличане и съхранение на User
обекти в база данни. Този клас от своя страна използва a Database
да направя точно това. Това прави отговорностите ясни и разделени. User
класът представлява потребителски данни, Database
класът взаимодейства с базата данни, UserORM/Manager/whatever
в средата преговаря между двамата.