2012-02-08 10 views
0

人と企業を格納するMySQLテーブルがあります。彼らは同じ分野を持っています。 PHPで私は持っている子クラスのオブジェクトインスタンスを作成するためのデザインパターン

class User{ 
var $_id; 
var $_data; 
function loadDataFromDb() 
{ 
} 
} 

class Company extends User 
{ 
    function getName() 
    { 
    //some implemantation 
    } 
} 


class People extends User 
{ 
function getName() 
{ 
//some implemantation 
} 
} 

オブジェクトを作成する最良の方法は何ですか?私が私のオブジェクトを作成するとき、私はクライアントのタイプが何であるか分からない。

$user = /* code missing */ 
$user->getName(); // this will trigger the appropiate method.` 
+1

どのように会社が利用者を拡張できますか? – PeeHaa

+0

問題は、MySQLからデータをロードした後に、どのタイプのユーザーがいるかを判断できることです。また、私はオブジェクトのプライベートデータとしてこのデータを持っていたい。 User()オブジェクトはありません。会社または人のみ。ユーザーは、PeopleとCompanyの親の総称です。あなたはClient()と言うことができます。 – catalinux

答えて

1

私はこの工場では、あなたが探しているオブジェクトを与えるようファクトリメソッドが存在する場合に適しているだろうと思う:

は、私のようなものが必要。
どのオブジェクトを返すかを工場に決定させるには、何らかの情報を渡す必要があります。

+0

私は、オブジェクト型に関する情報は何とかDBに格納されていると言いたいので、2つのフィールドはテーブルの唯一のフィールドではない可能性があり、ファクトリメソッドはこれを読み取ることができます。 – Stan

+0

問題は、MySQLからデータをロードした後に、どのタイプのユーザーを決定できるかということです。また、私はオブジェクトのプライベートデータとしてこのデータを持っていたい。 User()オブジェクトはありません。会社または人のみ – catalinux

0

この種の作業にDoctrineのようなORMを使用することはどうでしょうか。これは継承をサポートしていますので、これをデータベーススキーマにマップすることができます(これはDoctrineの具体的な継承クラス戦略です)。

それ以外の場合は、ここで目標と具体的な問題が何であるかを明確にしてください。

+0

Doctrineにその例がありますか?私は2週間前に教義のある他のプロジェクトで始めましたが、どんなヒントもいいです。 – catalinux

+0

オンラインの良いドキュメントがたくさんあります: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference /inheritance-mapping.html –

1

抽象ファクトリーパターン:

interface AbstractUserFactory{ 
    public function buildUser($type); 
} 

class UserFactory implements AbstractUserFactory { 
    public function buildUser($type='user'){ 
     if($type == 'user'){ 
      return new User(); 
     } else if ($type == 'company') { 
      return new Company(); 
     } else if($type == 'people') { 
      return new People(); 
     } else{ 
      throw new Exception("Unknown User type [$type]"); 
     } 
    } 

} 
関連する問題