2011-08-17 68 views
0

我不确定如何将部分代码移动到类中。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 } ?> 

我不确定如何将子信息(子信息后的代码:)移动到类中。它是否与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;      
}     
?> 
+0

什么样的子信息? –

+0

SQL请求放入类中,用于显示HTML/PHP变量的循环放入模板中。 – Elorfin

+0

首先,你应该研究OOP和它的工作原理..发现这在谷歌,似乎很好http://www.codeproject.com/KB/architecture/OOP_Concepts_and_manymore.aspx,然后你就会知道如何构建你的代码在一个班级。有关如何使用OOP的php技术规范,请参阅http://php.net/manual/en/language.oop5.php。 OOP还有更多的东西,然后只是在课堂上推出一些代码:P – Catalin

回答

0

在你的类,你已经所有信息。因此,一个sql查询的替代方法可能是一个额外的方法,该方法在专用字段info_results中搜索具有特殊标识的所有标题。例如: -

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'])); 
+0

感谢您的帮助! – markerpower

0

OOP的总体思路是,以情侣的数据与处理该数据的方法。因此,如果您觉得您的某些数据多次以相同的方式处理,那么引入一个将封装数据和逻辑的类是一个好主意。

当然它出现了很多其他问题:应该有多少类,它们应该如何相互作用,业务逻辑的哪个部分应该在哪个类中进行等等。没有普遍的,永远是真的答案针对这些问题,但是为解决这些问题制定了一些一般方法:the design patterns。关于这个话题有一些书籍,其中最着名的是四人帮(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); 
+0

感谢您的帮助! – markerpower