PHP过程到面向对象



我正在尝试将我的过程代码转换为oop。

 <?php
 $dbc = get_dbc();
 $info = mysqli_query($dbc, "SELECT info_id, info_title FROM text") or die("Error: ".mysqli_error($dbc));
 while ($info_row = mysqli_fetch_array($info))
 {
      $info_id = $info_row['info_id'];
      $info_title = $info_row['info_title'];
 ?>
 <div style="width: 100%;">
      <div style="float: left;">
           <?php echo $info_id; ?>
      </div>
      <div style="float: left;">
           <?php echo $info_title; ?>
      </div>
      <div style="clear: both;"></div>
 </div>
 <?php } ?>

我对没有HTML样式的类/对象的不完整尝试:

 <?php
 class InfoTest {
      private $info_id;
      private $info_title;
      public function __construct() {
           $dbc = get_dbc();
           $info = $dbc->query ("SELECT info_id, info_title FROM text");
           if ($dbc->error) {
                printf("Error: %sn", $dbc->error);
           }       
           while ($info_row = $info->fetch_array())
           {
                $info_id = $info_row['info_id'];
                $info_title = $info_row['info_title'];  
           }
           $info->free();
           $this->info_id = $info_id;
           $this->info_title = $info_title; 
      }

      public function setInfoID() {
           $this->info_id = $info_id;
      }
      public function getInfoID() { 
           return $this->info_id;
      }
      public function setInfoTitle() {
           $this->info_title = $info_title;
      }
      public function getInfoTitle() {
           return $this->info_title;
      }
      public function __destruct() {    
      }
 }
 ?>
 <?php
 $display = new InfoTest();
 echo $display->getInfoID();
 echo $display->getInfoTitle();
 ?>

我的程序代码打印出:1 One 2 Two.

我的oop代码打印出:2 Two

根据我的理解,oop以这种方式打印出来,因为$info_id和$info_title不是数组,只打印出最后存储的信息。

那么,如果我改变:

$info_id = $info_row['info_id'];
$info_title = $info_row['info_title'];

:

$info_id[] = $info_row['info_id'];
$info_title[] = $info_row['info_title'];

并打印数组,它显示了我想要的所有信息,但是如何以非数组形式显示它?

到目前为止我所做的是正确的还是我接近这个错误?

你做错了。在你的程序示例中,你一次迭代一行数据;在您的OO示例中,如果您将它们视为数组,然后将它们打印出来,那么您将一次一列地遍历数据。而不是将数据分成单独的id和标题,我将它们视为一个bundle(即类似于您在过程版本中所做的)- id与标题,而不是其他id,对吗?

例如,你可能有一个成员变量
private $texts = array();

,然后在构造函数中做:

while ($info_row = $info->fetch_array()) {
    $text = array(
        'id' => $info_row['info_id'],
        'title' => $info_row['info_title']
    );
    $this->texts[] = $text;
}

,然后提供一个方法来获取这个数组的数组:

public function getTexts() {
    return $this->texts;
}

最后,您可以像在过程性示例中那样对它进行迭代:

<?php
$display = new InfoTest();
foreach ($display->getTexts() as $text) {
    ?>
    <!-- html goes here -->
    <?php echo $text['info_id']; ?>
    <!-- more html -->
    <?php echo $text['info_title']; ?>
    <!-- other html -->
    <?
}
?>

退一步说——你可以问问这一切是否真的有必要。过程式PHP本身并没有什么问题——如果它能做你需要它做的事情,而且做得很清楚,那么在这里,你最好选择简单而不是复杂。

由于info id是对象中的数组,因此获取该值的相应函数应该采取偏移量。或者更好的是,你应该看看你的类实现迭代器这样你就可以对对象

执行foreach操作

在切换到面向对象之前,我首先要将代码模块化,并开始分割成具有相互分离逻辑的功能部分,例如数据库访问和模板:

<?php
/**
 * infos provider
 *
 * @return array
 */
function get_infos()
{
    $infos = array();
    $dbc = get_dbc();
    $info = mysqli_query($dbc, "SELECT info_id, info_title FROM text") or die("Error: ".mysqli_error($dbc));
    while ($info_row = mysqli_fetch_array($info))
    {
        $infos[] = (object) $info_row;
    }
    return $infos;
}
foreach(get_infos() as $info)
{
?>
<div style="width: 100%;">
     <div style="float: left;">
          <?php echo $info->info_id; ?>
     </div>
     <div style="float: left;">
          <?php echo $info->info_title; ?>
     </div>
     <div style="clear: both;"></div>
</div>
<?php } ?>

然后将数据库相关的函数移动到它自己的文件中,以将其与"模板"解耦。完成这些之后,您可以考虑进一步的步骤来进行重构。我建议如下阅读(这仅仅是独立于命名框架):当平面PHP遇到symfony.

相关内容

  • 没有找到相关文章

最新更新