3

手続き型コードを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 One22。

私のoopコードは次のように出力されます:2 Two

私の理解では、$info_idと$info_titleは配列ではなく、最後に保存された情報のみを出力するため、oopはそのように出力されます。

だから、私が変更した場合:

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

に:

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

配列を印刷すると、必要なすべての情報が表示されますが、配列以外の形式で表示するにはどうすればよいですか?

私が今までやってきたことは正しいですか、それとも私はこれに近づいていますか?

4

3 に答える 3

0

info idはオブジェクト内の配列であるため、値を取得するための対応する関数はオフセットを取る必要があります。または、オブジェクトに対してforeachを実行できるように、イテレータを実装しているクラスを確認する必要があります。

于 2011-08-16T02:07:12.007 に答える
0

あなたはそれを間違っています。手続き型の例では、一度に1行ずつデータを反復処理しています。OOの例では、それらを配列として扱い、次にそれらを出力する場合、代わりに一度に1列ずつデータを調べます。データを別々の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には本質的に何も問題はありません。必要なことを実行し、明確に実行する場合は、ここでは複雑なものよりも単純なものを優先する方がよいでしょう。

于 2011-08-16T02:15:36.903 に答える
0

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

次に、データベース関連の関数を独自のファイルに移動して、「テンプレート」から切り離します。それが終わったら、リファクタリングするためのさらなるステップについて考えることができます。私は次の記事を読むことをお勧めします(これは単に名前付きフレームワークから独立しています):フラットPHPがsymfonyと出会うとき

于 2011-08-16T02:19:28.930 に答える