0

独自の「シンプルな」CMSシステムを作成することで、PHPと一般的なコーディングの知識を広げています。

私のデータベース構造は次のとおりです。

USERS --< WEBSITES --< PAGES

私のロジックでは、、、およびクラスの3つのクラスがUserありWebsiteますPage継承されません

Userクラスには、USER TABLEプラス属性のすべての属性があり$_websiteます。

Websiteクラスには、すべての属性に加えて、オブジェクトWEBSITE TABLEの配列がありますPage

私がこれを実行することを決定した方法は、ページの読み込み時に、これらのクラスが作成され、データベースデータで埋められることです。

したがって、htmlでは、次のようにクラスを呼び出すだけで結果をエコーアウトできます。

$USER -> name;
$USER -> website -> get_pages();
$USER -> website -> pages[0] -> get_header();

これらのクラスは継承できることに気づいたので、Page継承WebsiteしてWebsite継承しますUser

しかし、そのようにすると、次のPageようにクラスをインスタンス化します。

$PAGES = array(); 
$PAGES[] = new Page( $constructor_data_to_construct_user_website_and_page );

このようにすると、オブジェクト$PAGES[0]には、そのページに関連するすべての情報、Webサイト(最初の親)に関連するすべての情報、およびユーザー(2番目の親)に関連するすべての情報が含まれます。

次に別のものを作成する場合、同じものと詳細をコピーPageしているだけですはいUserWebsite

だから私がvar_dump $PAGES[0]IDを取得した場合、すべての情報を取得しUSER, WEBSITEPAGE

IDの場合、 ANDのvar_dump $PAGES[1]すべての同じ情報を取得しますが、データは異なります。USERSWEBSITEPage

したがって、継承は、ユーザーオブジェクトとWebサイトオブジェクトの不要なコピーを引き起こしています

私が本質的にできるので:

$PAGES[0] -> username // username is a property of the Users class
$PAGES[1] -> username

どちらもまったく同じ値を返します。

データが不必要にコピーされているので、これは確かに悪いことです!

これは正しいです?

それとも、この質問はゴミの山であり、これはそのような状況inheritanceが使用されているのではありませんか?

4

4 に答える 4

3

これはまさに、継承を使用してはならないような状況です。

継承は、IS-A関係をモデル化することを目的としています。典型的な例:aはのStudentタイプでPersonあるため、からStudent継承しPersonます。

継承は、関係をモデル化することを意味するものではありませHAS-A。典型的な例:aCarにはEngineがありますが、タイプでCar はありませんEngine

関係がある場合(たとえば、ユーザーがWebサイトを持っている場合HAS-A)、ほとんどの場合、継承ではなく構成を使用する必要があります。

悪い

class Website extends User {}

良い

class Website {
    private $users;
}
于 2012-04-05T12:09:30.313 に答える
0

継承は、基本的に親クラスの特定のタイプであるサブクラスが必要な場合に使用されます。したがって、たとえば、馬は特定の種類の哺乳類であり、哺乳類は特定の種類の動物であるため、たとえば、動物->哺乳類->馬の階層は妥当な継承階層になります。

あなたの場合、私は継承を使用しません。Webサイトにはページが含まれていますが、ページはWebサイト自体の拡張ではなく、ユーザーはまったく別のものです。決定を下すときは、通常、「is-a」と「has-a」を使用します。

ページはウェブサイトであるのに対し、ウェブサイトにはページがあります

この場合、後者(has-a)の方がわかりやすいと思います。「is-a」というフレーズの方が適している場合は、継承の候補として適している可能性があります。

于 2012-04-05T12:09:57.947 に答える
0

いいえ、これは正しくありません。1つが別のサブタイプである場合にのみ継承する必要があります。

たとえば、人を代表している場合、マネージャーは特定のタイプの従業員であるため、マネージャーが従業員を継承するような関係がある可能性があります。Webサイトは特定のタイプのユーザーではないため、継承は意味がありません。

代わりにあなたが探しているのは、単純な関係(集約)です。これは、Webサイトに多くのページがあり、ユーザーが多くのWebサイトを持っている可能性があるためです。

于 2012-04-05T12:10:21.007 に答える
0

Webサイトとユーザーフィールドをクラスで「静的」として宣言する場合:

class Website extends User {
    protected static $_xxx = '123';
}

class User {
    protected static $_username = 'Fred';
}

その場合、それらはコピーされませんが、まったく同じ値になります。

しかし、これはその場所での継承を行うのは間違っています-その結合されたオブジェクトですが、継承されません。したがって、この場合は継承を使用しないでください。親クラスは子クラスのスーパーセットである必要があります。

于 2012-04-05T12:14:50.847 に答える