2017-01-18 8 views
0

私はOOPで本当に新しいです、とよくない英語話者なので、私の質問がダムである場合、私は申し訳ありませんがあります。 私はoopを理解していると思っていましたが、私がそれを使ってコードを書き始めると、うまくいくと思います。 次のコードは私の最初の試みです、私はそれらの後に私の質問をします。 (私は、データベース・コードをカットしますが、私はプログラムの動作言ったように。)は(PHPを使用して)OOPにおける関係

// class.Post.inc

class Post { 
    private $_db; 
    private $_postId; 
    private $_title; 
    private $_creatorId; 

    public function __construct() { 
     $this->_db = Database::getInstance()->getConnection(); 
    } 

    public function getApost($postId = 0) { 
     if($postId){ 
      /* get the post data from database(including user_id) and put them in the instance variables */ 
      $this->_postId = $row ['post_id']; 
      $this->_title = $row ['title']; 
      $this->_creatorId = $row ['user_id']; 
     } 
    } 

    public function getCreator() { 
     $creator = new User(); 
     return $creator->getUserObject ($this->_creatorId); 
    } 

    public function getPostId() { 
     return $this->_postId; 
    } 

    public function getTitle() { 
     return $this->_title; 
    } 
} 

//class.User.inc

class User { 
    private $_db; 
    private $_userId; 
    private $_name; 

    public function __construct() { 
     $this->_db = Database::getInstance()->getConnection(); 
    } 

    public function getUserObject($userId = null) { 
     if ($userId) { 
      /* read data from database and put them in the instance variables */ 
      $this->_userId = $row ['user_id']; 
      $this->_name = $row ['name']; 

      return $this; 
     } 

     return false; 
    } 

    public function getUserId() { 
     return $this->_userId; 
    } 

    public function getName() { 
     return $this->_name; 
    } 
} 

// index.phpの

spl_autoload_register (function ($className) { 
    require_once 'classes/class.' . $className . '.inc'; 
}); 

$post = new Post(); 
$post->getApost(1); 
$creator = $post -> getCreator(); 
echo $post->getPostId() . '<br>'; 
echo $post->getTitle() . '<br>'; 
echo $creator->getName() . '<br>'; 

私の質問:

  1. 投稿者は作成者を持っています。この関係を正しく設計できますか?
  2. 投稿を投稿者とその作成者を一緒に選択するにはどうすればいいですか?
  3. 投稿のリストを表示する場合は、投稿クラスまたはインデックスページに新しいメソッドを定義するか、新しいクラスを定義する必要がありますか?どうやって?
+0

http://codereview.stackexchange.com/ – k0pernikus

+0

上のより良いフィットあなたがあなたのコードの間違いがある可能性があります。 1)DI https://en.wikipedia.org/wiki/Dependency_injectionとして接続を渡す必要があります。 2) 'getUserObject'、' getApost'はエグゼクティブ 'new User(userId)'、 'new Post(postId)'は適切なクラスインスタンスを返すべきです。 https://en.wikipedia.org/wiki/Active_record_patternもチェックしてください –

答えて

1

あなたのコードについて言うことができることは多いです。何時間も間違ったことを書くことができましたが、あなたはそれを求めなかったので、私はあなたの質問に最初に答えます。

  1. はい、エンティティリレーションシップの観点から投稿者を作成しても問題ありません。
  2. 私はあなたの実装を使用してきれいな方法を参照してくださいない。可能ですが、大きなリファクタリングが必要です。
  3. Active Recordパターンを使用する場合は、もちろんPostクラスで新しいメソッドを実装できます。しかし、私はずっとData Mapperのパターンを使って、OOTの視点からもっときれいであることをお勧めします。これはSRPのためです。

最後に1つのアドバイス: 新しい開発者がホイールを再発明することがよくあります。これはまさにあなたがやっていることです。あなた自身の記事を書くのに多くの時間を節約する優れた機能ライブラリがあります。例えば、Doctrine ORM。またはより単純なNextras ORM。学習曲線は高く見えるかもしれませんが、私はそれが価値があることを保証します。

関連する問題