2017-12-27 22 views
0

こんにちは私は、モデルクラスの実装が少なくともOOPスタイルに合っているかどうか尋ねたいと思います。それだけ クラスを拡張する上で使用することができるように 私は抽象として宣言phpでのモデルクラスの適切な実装

サンプルコード:

<?php 
/** 
* class model handles dbconfig and some common query transaction 
* i declare it as an abstract so that it can only be used on extending the 
*class 
*/ 
abstract class Model 
{ 
    //db config 
    protected $sHost  = "localhost"; 
    protected $sUser  = "root"; 
    protected $sPass  = " "; 
    protected $sDb  = "test"; 
    protected $sEngine = "MySQL"; 
    protected $conn ; 

    //constructor 
    public function __construct() 
    { 

     $this->conn = new mysqli($this->sHost, $this->sUser, $this->sPass , $this->sDb); 

    } 


    protected function db_query_list($sSql){ 

     if ($resultset = $this->conn->query($sSql)) { 
      if ($resultset->num_rows > 0) { 
       $data = array(); 
       while($row = $resultset->fetch_assoc()) { 
        $data[] = array_change_key_case($row); 
       } 
      }else { 
      $data = false; 
      } 
     } else { 
      $data = false; 
     } 

     $resultset->close(); 
     return $data; 

    } 

    protected function execute_query($SQL) { 

     $run = $this->conn->query($this->sEngine); 

     return $run; 
    } 

} 

は次に実装iは

<?php 

require "Model.php"; 

class CustomerModel extends Model 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function getAllCustomer() 
    { 
     $sSql = "SELECT * 
       FROM t_classification_header 
       "; 


     return $this->db_query_list($sSql); 
    } 

} 

注意CustomerModelにモデルを拡張すること私はを使っています。parent :: __ construct();。 私はOOPでどんな助けも私の喜びになるでしょう コメントと提案は大歓迎です。

+4

スタックオーバーフローではなく[コードレビュー](https://codereview.stackexchange.com/)に属しているため、この質問を議論の対象外としています。 –

+0

悲しいことに、そのようなコメントを参照してください –

+0

あなたは良いOOPアーキテクチャを探しているなら、私はSymfonyを見ることをお勧めしたいと思います。データベースで動作するクラスが必要な場合は、クラス自体を拡張するのではなく、依存関係注入を使用することをお勧めします。 –

答えて

1

1)実際にDBと対話するために分離されたクラス(おそらくシングルトン)を作成し、モデルコンストラクタの引数としてを渡してください。どうして?あなたのコードより5人の顧客を使って作業すると、5つのDB接続が作成されます。 (依存性注射/組成)

2)return $this->db_query_list($sSql);をしないでください。結果をCustomersListにラップし、各行をCustomerにラップします。

3)CustomerModelの代わりに、all()byId($id)などの方法でクラスCustomers($DB)を作成しました。真面目に言うと、私たちは写真代理店ではなく、モデルでは動作しません。はい、クラスはデータモデルですが、なぜこのコードを気にしますか?私たちにとっては、これは具体的なデータと振る舞いを持つ具体的なCustomerです。

+0

洞察兄弟に感謝 –

関連する問題