2017-12-27 91 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; 
    } 

} 

그런 다음 구현에 내가

<?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에서 모델을 확장하는 나는 부모를 사용한다 :: __ construct();. OOP에 새로운 사람이라면 도움이 될 것입니다. 의견이나 제안을 환영합니다.

+4

스택 오버플로가 아니라 [코드 검토] (https://codereview.stackexchange.com/)에 속하기 때문에이 질문을 주제와 관련이없는 것으로 닫으려고합니다. –

+0

슬픈 댓글을 보시려면 –

+0

좋은 OOP 아키텍처를 찾고 계신다면 Symfony를 살펴 보시기 바랍니다. 데이터베이스에서 작동하는 클래스가 필요하면 클래스 자체를 확장하는 대신 종속성 삽입을 사용하는 것이 좋습니다. –

답변

1

1) 실제로 DB와의 상호 작용을 위해 분리 된 클래스 (심지어는 싱글 톤)를 만들고 을 모델 생성자의 인수로 전달하십시오. 왜? 코드 5 개를 사용하는 고객은 DB에 5 개의 연결을 생성합니다. (Dependency Injection/composition)

2) return $this->db_query_list($sSql);하지 마십시오. 검색 결과를 CustomersList에 넣거나 각 행을 Customer에 입력하십시오.

3) CustomerModel 대신 all(), byId($id) 등의 메서드를 사용하여 클래스 Customers($DB)을 만듭니다. 진지하게, 우리는 사진 대행사가 아니며 모델을 사용하지 않습니다. 예, 클래스는 데이터 모델이지만이 코드는 왜 귀찮은가요? 우리에게는 구체적인 데이터 및 동작과 함께 구체 Customer입니다.

+0

통찰력에 감사드립니다 형제 –