Просто правило:ако клас 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 в средата преговаря между двамата.