Mysql
 sql >> база данни >  >> RDS >> Mysql

Разширяването на класовете добра практика ли е?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на JDeveloper с MySQL база данни и Oracle Database на AWS RDS, част 3

  2. MySQL конвенции за именуване, трябва ли името на полето да включва името на таблицата?

  3. комбиниране на месечни фючърсни данни с времеви серии от предния месец в MySQL

  4. Вмъкване в същата таблица, задействане на mysql

  5. Как работят MIN() и MAX() върху низове CHAR/VARCHAR в MySQL?