2015-01-28 4 views
0

나는 데이터베이스에서 게시물의 모든 데이터를 가져 오는이 클래스를 만들었습니다.다른 클래스의 클래스를 사용하는 가장 좋은 방법

class Post { 
    private $id; 
    protected $conn; 
    public $data; 

    function __construct(\mysqli $conn) { 
     $this->conn = $conn; 
    } 

    public function getId() { 
     return $this->id; 
    } 

    public function getConnection() { 
     return $this->conn; 
    } 

    public function getPost() { 
     $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id); 

     if ($query1->num_rows == 1) { 
      $this->data = $query1->fetch_object(); 
      return $this->data; 
     } 
    } 

    public function setId($id) { 
     $this->id = (int)$id; 
    } 
} 

게시물과 함께 게시물을 만든 사용자의 모든 데이터도 가져와야합니다. 이 작업을 수행하는 세 가지 방법이 있습니다.

1) Post 클래스의 User 클래스를 호출합니다. 사용자 클래스와 포스트 클래스를 확장하여

public function getPost() { 
     $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id); 

     if ($query1->num_rows == 1) { 
      $this->data = $query1->fetch_object(); 

      // Initiating User class 
      $user = new User($this->getConnection()); 
      $user->setUserId($this->data->user_id); 
      $this->data->user = $user->getUserInfo(); 

      return $this->data; 
     } 
    } 


2). 사용자의 특성을 작성하고 포스트 클래스를 사용하여 사용자 클래스

public function getPost() { 
     $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id); 

     if ($query1->num_rows == 1) { 
      $this->data = $query1->fetch_object(); 

      // Calling methods from the User class 
      $this->setUserId($this->data->user_id); 
      $this->data->user = $this->getUserInfo(); 

      return $this->data; 
     } 
    } 


3)에서

class Post extends User { 
    .... 

그런 다음 호출 방법.

class Post { 
    use UserTrait; 
    .... 

그런 다음 사용자 특성이 3 사이

public function getPost() { 
     $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id); 

     if ($query1->num_rows == 1) { 
      $this->data = $query1->fetch_object(); 

      // Calling methods from the User trait 
      $this->setUserId($this->data->user_id); 
      $this->data->user = $this->getUserInfo(); 

      return $this->data; 
     } 
    } 


, 의존성 주입, 성능 및 코드의 청결면에서 가장 좋은 방법은 하나의 메소드를 호출?

답변

0

이 질문은 당신이 의견을 요청하고 있기 때문에 지옥을 downvoted 얻을 수 있습니다,하지만 난 내 두 센트에 던질거야가.

기본적으로 기본 ORM을 작성하고 있습니다. ORM에서 엔티티를 다루고 있습니다. 다른 엔티티는 다른 클래스 (모델)에 의해 처리되어야하며 기본 DB 테이블과 모델간에 1 : 1 동등성이 있어야합니다.

엔티티간에 관계가 있습니다. Yous Post 엔티티에는 User 엔티티의 인스턴스 여야하는 작성자가 있습니다. 그러나 게시 테이블과 사용자 테이블 간의 관계가 동일한 모델 또는 상위 모델의 다른 풍미로 나타낼 수 있음을 의미하지는 않습니다. 당신은 전체 ORM (교리, 추진, RedbeanPHP)를 사용한 경우

당신은 포스트 저자와 같은 관계 (귀하의 경우 getPost()) 검출 한 후 개체를 getById() 같은 방법을 사용하는 경우에 진행됩니다 것을 의미 볼 것 인스턴스는 기본적으로 의존하는 모든 엔티티를 나타냅니다.

$this->data->user_id 대신에 ORM은 중첩 된 $this->data->user 개체를 제공하므로 혼자 처리 할 필요가 없습니다.

그래서 ORM을 사용하기에는 너무 빠르다고 생각하면 첫 번째 방법은 시간이 갈수록 더 쉽게 마이그레이션하고 마이그레이션 할 수 있습니다. 이 시점에서

관련없는 의견

, 당신은 당신이 당신의 생성자를 변경 한 경우

$post = new Post($conn); 
$post->setId($postid); 
$postdata = $post->getPost(); 

을 할 필요가 게시물 정보를 얻을하고 getById() 메소드를 추가하는 등 그

function __construct(\mysqli $conn) { 
    $this->conn = $conn; 
    return $this; 
} 

public function getById($id) { 
    $this->setId($id); 
    return $this->getPost(); 
} 

대신 한 줄에 게시물 데이터를 검색 할 수 있습니다.

$postdata=(new Post($conn))->getById($postid); 
+0

감사합니다. @amenadiel –

0

모두 계속 진행할 것인가에 달려 있습니다. 확장 클래스를 사용하면 다른 클래스의 영구 메소드를 사용하려는 경우 더 잘 다룰 수 있습니다. 다른 클래스의 일부만 필요하면 클래스와 그 메소드를 호출하십시오.

주의 : 확장 클래스는 단일 클래스로 동작합니다. 메소드와 함수의 이름이 같은 경우 많은 충돌이 발생할 수 있습니다.

0

저는 이것이 코드의 다른 측면에 달려 있다고 생각합니다. 개인적으로 나는 특성을 사용하는 것이이 특별한 경우에 필요하다고 생각하지 않기 때문에 단지 클래스 사용자를 확장 할 것입니다.

PHP의 특성을 사용하는 방법에 대한 여기에 유용한 기사가 - Using Traits in PHP 5.4

관련 문제