PHP OOP类帮助

时间:2011-08-17 06:28:35

标签: php oop

我不确定如何将部分代码移动到类中。

 <?php
 class InfoTest {

      private $info_results;

      public function __construct() {
           $dbc = get_dbc();
           $info = $dbc->query ("SELECT info_id, info_title FROM text");
           if ($dbc->error) {
                printf("Error: %s\n", $dbc->error);
           }       
           while ($info_row = $info->fetch_array())
           {
                $info_results[]= $info_row;
           }
           $info->free();
           $this->info_results = $info_results;
      }


      public function setInfo() {
           $this->info_results = $info_results;
      }

      public function getInfo() { 
           return $this->info_results;
      }

      public function __destruct() {    
      }

 }

  ?>
 <?php
 $display = new InfoTest();
 foreach ($display->getInfo() as $info_row) {
 ?>
 <!-- html -->
 <?php echo $info_row['info_title']."</a><br />"; ?>  
 <!-- html -->
 Sub-Info: 
 <?php 
 $dbc = get_dbc(); 
 $si_title = $dbc->query ("SELECT info_title FROM text WHERE info_id = ".$info_row['info_id']."");
 if ($dbc->error) {
      printf("Error: %s\n", $dbc->error);
 }
 $num =$si_title->num_rows;
 $count = 0;
 while ($sub_info = $si_title->fetch_array())
 {
      $sub_info_title = $sub_info['info_title'];
      if ($count!=$num-1)
      {
           echo $sub_info_title." , ";
           $count++;
      }
      else echo $sub_info_title;                    
  }                  
 ?>
 <!-- html -->
 <?php } ?>

我不确定如何将Sub-Info(Sub-Info :)之后的代码移动到一个类中。它与InfoTest属于同一类,它是一个属于自己的类,还是根本没有进入类中?

子信息代码:

 <?php 
 $dbc = get_dbc(); 
 $si_title = $dbc->query ("SELECT info_title FROM text WHERE info_id = ".$info_row['info_id']."");
 if ($dbc->error) {
      printf("Error: %s\n", $dbc->error);
 }
 $num =$si_title->num_rows;
 $count = 0;
 while ($sub_info = $si_title->fetch_array())
 {
      $sub_info_title = $sub_info['info_title'];
      if ($count!=$num-1)
      {
           echo $sub_info_title." , ";
           $count++;
      }
      else echo $sub_info_title;                    
 }                   
 ?>

2 个答案:

答案 0 :(得分:0)

在课堂上你已经掌握了所有信息。因此,sql-query的替代方法可能是另一种方法,它会在私有字段info_results中搜索具有特殊ID的所有标题。 E.g:

public function getInfoTitles($info_id) {
    $titles = array();
    foreach ($this->info_results as $info_row) {
        if ($info_row['info_id'] == $info_id)
            $titles[] = $info_row['info_title'];
        }
    }
    return $titles;
}

您的子信息代码是:

echo implode(', ', $display->getInfoTitles($info_row['info_id']));

答案 1 :(得分:0)

OOP的一般概念是将数据与处理该数据的方法耦合。因此,如果您觉得某些数据以相同的方式被多次处理,那么引入一个将填充该数据和逻辑的类是个好主意。

当然,它出现了很多其他问题:应该有多少个类,它们应该如何相互作用,哪个部分的业务逻辑应该进入哪个类等。没有普遍的,始终如一的答案这些问题,但开发了一些解决这些问题的一般方法:the design patterns。有一些关于这个主题的书籍,其中最着名的是Gang of of Four(GoF)Design Patterns

这是关于这个主题的一般想法。在您的特定情况下,我建议您创建新的类ItemInfo,因此InfoTest类仅负责查询数据库并创建此新类的实例。

 class InfoTest {

  private $items;

  public function __construct() {
      $this->items = new Array();
  }

  private function queryItems($itemId){
       $dbc = get_dbc();
       $info = $dbc->query("SELECT info_id, info_title FROM text");
       if ($dbc->error) {
            printf("Error: %s\n", $dbc->error);
       }       
       while ($info_row = $info->fetch_array())
       {
            $item = new ItemInfo($info_row);
            $this->items[] = $item;
       }
       $info->free();
  }

  public function getItems($itemId){
    if (empty($this->items)){
        $this->queryItems($itemId);
    }
    return $this->items;
  }

  /* Other functions. */
  public function __destruct() {    
  }
 }

Class ItemInfo{
    private $id, $title;
    function __construct(Array $params){
        $this->id = $params['item_id'];
        $this->title = $params['item_title'];
    }

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

    function toString(){
        retirn "I'm item {$this->id}, my title is {$this->title}";
    }
}

你的代码就像

一样简单
$item_test = new ItemTest();
$items = $item_test->getItems($item_id);
$titles = array();
foreach ($items as $item){
    //you may process your items in any way you need
    $titles[] = $item->getTitle();
}
echo implode(',', $titles);