面向对象编程的PHP过程

面向对象编程的PHP过程,php,html,oop,procedural,Php,Html,Oop,Procedural,我正在尝试将我的过程代码转换为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']; $

我正在尝试将我的过程代码转换为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 } ?>
致:

然后打印数组,它会显示我想要的所有信息,但是如何以非数组形式显示它呢


到目前为止,我所做的是正确的还是错误的?

因为info id是对象中的一个数组,所以获取值的相应函数应该有一个偏移量。或者更好的是,您应该查看实现迭代器的类,这样您就可以在对象上执行foreach操作了

您做错了。在您的过程示例中,您一次迭代一行数据;在您的OO示例中,如果将它们视为数组,然后打印它们,那么您将一次遍历一列数据。我不会将数据分离为单独的id和标题,而是将它们视为一个捆绑包(即,类似于您在过程版本中的做法)-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没有本质上的错误-如果它做了您需要它做的事情,并且做得很清楚,那么您最好选择简单而不是复杂。

在切换到OOP之前,我首先将代码模块化,并开始分割成逻辑彼此分离的功能部分,例如,数据库访问和模板制作:

<?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 } ?>


然后将与数据库相关的函数移动到它自己的文件中,以将其与“模板”分离。完成后,您可以考虑进一步的重构步骤。我建议阅读以下内容(仅与命名框架无关):.

投票迁移到只迭代公共属性的@hakre。我想Matthew说的是实现
IteratorAggregate
(或类似)以在内部array@Phil:显然,是的。这只是一个暗示,它已经在一定程度上适用于对象(就像它在一定程度上适用于数组一样)。
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

/**
 * 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 } ?>