PHP процедурный ООП - PullRequest
       47

PHP процедурный ООП

3 голосов
/ 16 августа 2011

Я пытаюсь преобразовать свой процедурный код в 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: %s\n", $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 Один 2 Два.

Мой код распечатки: 2 Два

Насколько я понимаю, 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'];

И распечатать массивы, они отображают всю информацию, которую я хочу, но как отобразить ее в форме, не являющейся массивом?

Правильно ли то, что я делаю до сих пор, или неправильно?

Ответы [ 3 ]

0 голосов
/ 16 августа 2011

Вы делаете это неправильно.В вашем процедурном примере вы перебираете данные по строке за раз;в вашем OO-примере, если вы рассматриваете их как массивы, а затем печатаете их, вместо этого вы просматриваете данные по столбцам за раз.Вместо того, чтобы разделять данные на отдельные идентификаторы и заголовки, я бы относился к ним как к пакету (т. Е. Аналогично тому, как вы делали это в процедурной версии) - идентификатор идет с заголовком, а не с другими идентификаторами, верно?

Так, например, вы можете иметь переменную-член

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 нет ничего плохого по сути - если он делает то, что вам нужно, и делает это четко, вам, возможно, лучше отдать предпочтение простому, а не сложному.

0 голосов
/ 16 августа 2011

Прежде чем перейти к ООП, я бы прежде всего модулировал код и начал сегментировать его на функциональные части, которые отделяли логику друг от друга, например, доступ к базе данных и шаблоны:

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

0 голосов
/ 16 августа 2011

Поскольку info id является массивом в вашем объекте, соответствующая функция для получения значения должна принимать смещение.Или, что еще лучше, вы должны посмотреть на свой класс, реализующий итератор, чтобы вы могли просто выполнять foreach над своим объектом

...