1

私はいくつかの単純なクラスを持つ PHP プロジェクトに取り組んでいます。私は自分のクラスをより複雑にすることに取り組んでいますが、ユーザーの管理、構成設定、表示などの追加の目的にもクラスを使用したいと考えていました。クラスを「整理」する方法を理解するのに苦労しています。 . これらのクラスをどのように拡張すればよいですか?

私は次のクラスを持っています:

//main application settings, constants, etc.
Class Config {
}

//add/edit/delete/check permissions of users
Class Users extends Config {
}

//displays the pages
Class Display extends Config {
}

//main application
Class Analysis extends Config {
}

//specific methods for this type of analysis
Class Standard extends Analysis {
}

//specific methods for this type of analysis
Class Consolidated extends Analysis {
}

私が抱えている問題は、他のすべてのクラス (表示、分析、標準、および統合) からユーザーおよび構成クラスにアクセスできるようにしたいということです。どうすればいいですか?クラスを適切に拡張していますか? ディスプレイと分析はユーザーを拡張する必要があるように感じますが、それは私には適切ではないようです。あなたが提供できる助けに感謝します。ありがとう!

4

4 に答える 4

1

You can try

trait Config {
}

// Common to Display
abstract class Display {
    function __construct(Users $user);
}

// Common to analysis
abstract class Analysis {

    function __construct(Users $user);
}

// add/edit/delete/check permissions of users
class Users {
    use Config ;
}

// Mobile Display
class Mobile extends Display {
}

// Web Display
class Web extends Display {
}

// specific methods for this type of analysis
class Standard extends Analysis {
}

// specific methods for this type of analysis
class Consolidated extends Analysis {
}

// main application
class Main {
    use Config ;
    public function setDisplay(Display $display);
    public function setAnalysis(Analysis $analysis);
}

$user = new Users("Jeff");
$main = new Main();
$main->setDisplay(new Mobile($user));
$main->setAnalysis(new Standard($user));
于 2012-10-31T20:11:01.810 に答える
1

私のプロジェクトでは、Users クラスと Config クラスはシングルトン クラスであり、1 つの単純なメソッド呼び出しでインスタンスを他のクラスに簡単にプルできます。

Class User{
    private static $_instance;

    private function __construct(){
    }

    public function getInstance(){
        if( !self::$_instance ){
            self::$_instance = new User();
        }

        return self::$_instance;
    }
}

次に、そのユーザーオブジェクトへのアクセスが必要な場所ならどこでも

$user = User::getInstance();
于 2012-10-31T19:56:55.877 に答える
0

それらを別々のファイルに保管してから、オートロードを使用してください。OOP に夢中になる傾向を避けてください。クラスは、単に拡張メソッドではなく、プロパティとして参照できることに注意してください。

于 2012-10-31T19:57:24.070 に答える
0

一般的な経験則として、「is-a」原則を使用して、クラスの階層を編成できます。あなたが説明するものについては、次のようになります。

  • StandardConsolidatedは ( is-a の意味で)Analysisであるため、階層の適切な候補のように見えます。
  • UserDisplay値にアクセスする必要がありますConfigが、それらは概念的な方法で関連しておらず、共通の動作も共有していないようです。したがって、ここでは継承よりも合成の方が適しているようです。

is-a原則に関しては、サブクラスが継承する動作がそれに属さない場合、一般的に適合しないことがわかります。したがって、たとえば、Configクラスに が含まれている場合、気saveValuesToDB()にする必要のないもののように見えUserます (つまり、設定値が DB にどのように格納されるか)。継承と構成を検索すると、この主題に関する多くの情報を見つけることができます。これは、パターン コミュニティで繰り返し取り上げられている主題です。OO の設計とパターンに関する優れた書籍のリストは、こちら にあります

HTH

于 2012-10-31T20:36:02.090 に答える