0

私は必死にOOPに移行しようとしていますが、いつそれを使用するかについて頭を悩ませることはできません. 仕組みはわかりましたが、いつ使用するかはクリックしないだけです。私の現在のシナリオが OOP アプローチの機が熟しているかどうかに興味があります。

3ページあります。Details.php は、2 つの div を並べて表示します。ユーザーがメモを追加できる場所と、MySQL に保存されている以前のメモを確認できる場所です。Details.php の AJAX 関数を使用して、メモを追加したり、メモを引き出したりできます。javascript 関数は add_notes.php を呼び出してデータベースにメモを追加し、load_notes.php を呼び出して Jquery .load() を介してページにメモをロードします。また、新しいメモが送信されて div が更新された場合も同様です。

私は初心者ですが、このコードを整理するためのより良い方法があると感じています。私はフレームワークを調べますが、私はすでにこのプロジェクトに深く関わっているので、これをより適切に分割する方法に関する OOP のアイデアや、可能な限り合理化された方法でそれを行っていることの検証を探しています。すべてのコメントが役に立ちます!

詳細.PHP

<script type="text/javascript">
$(document).ready(function(){
//When loading page load notes/messages tables and then reload when ajax is done        
$('#note_holder').load('load_notes.php?subcat=<? echo $subcat;?>'); 
    //onclick handler send message btn
    $("#notes_submit").click(function(){
        $(this).closest('form').submit(function(){
            return false;
        });
        var frm = $(this).closest('form');              
        var data = $(frm).serialize();
             if($(frm).valid()){                                
                    $.post( 
                            "../php/add_notes_ajax.php", 
                            data, 
                            function(data){                             
                                $('#note_holder').load('load_notes.php?subcat=<? echo $subcat;?>');
                            } 
                    );
             }
    });           
});
</script>  

<div style="float:left; margin-left:15px;">
    <form  name="messages1" class="form" id="myforma" method="post" action="#" enctype="multipart/form-data">
        <fieldset style="width:500px; height:400px; overflow:auto; font-size:11px;">
            <legend>Click to View Previous Notes / Messages</legend>            
            <div style="height:350px; overflow:auto;" class="note_holder" id="note_holder">
             <!--This div is being called from the ajax script to load add_notes_ajax.php-->              
            </div>           
        </fieldset>
        <div style="margin-top:20px;"></div>
    </form>    
</div>

<div style=" float:right;">
  <form  name="notes" class="notes" id="notes" method="post" action="#" enctype="multipart/form-data">
    <fieldset style="width:300px; height:400px;">
      <legend>Enter a Note</legend>
      <div style="margin-top:00px;"></div>
      <div>
     <textarea rows="20" cols="20" style="height:300px; width:290px;" name="notes"></textarea>
     <input type="submit" name="notes_submit" id="notes_submit" value="Submit Note" class="button"  />
     <input type="hidden" name="subcat" value= "<?php echo $subcat; ?>" />
      </div>
    </fieldset>
    <div style="margin-top:20px;"></div>
  </form>
</div>

追記 AJAX.PHP

<?php
include_once('../bootstrap.php');
include_once('../site_globals/common_functions.php');
include_once('../site_globals/common_queries.php');
include_once('../php/gump.class.php');
page_protect();
error_reporting(0); 

$firstname = filter($_SESSION['user_name']);
$myid      = filter($_SESSION['user_id']);

// All the variables from the submission form 
$notes     = filter($_POST['notes']);
$subcat    = filter($_POST['subcat']);

//Insert Notes into the database

    $stmt = $dbh->prepare('
        INSERT INTO `notes` 
            (date  , sub_cat_id , notes) 
        VALUES 
            (:date , :subcat    , :notes )
            ');
    $stmt->bindValue('subcat',    $subcat);
    $stmt->bindValue('date',    date('Y-m-d H:i:s'));
    $stmt->bindValue('notes',    $notes);
    $stmt->execute();       

echo "This note was added successfully";
exit;

?>

. NOTES.PHP をロード

<table width="100%">
  <thead style="text-align:left; ">
    <tr style="font-size:14px; font-weight:bold;"> 
      <!-- <th><input class="check-all" type="checkbox" /></th>-->
      <th>Date</th>
      <th >Contents</th>
      <th>Preview / Print</th>
    </tr>
  </thead>
  <?php while ($messages_row = mysql_fetch_object($messages_res)):?>
  <tr>
    <td><a target="_blank" href="../site_hospital_files/thread.php?question_id=<?php echo $messages_row->question_id;?>"><?php echo substr($messages_row->reply, 0, 20) . '...';?></a></td>
    <td><?php echo date('Y-m-d', strtotime($messages_row->date_added));?></td>
    <td><a href="../site_hospital_files/pdf_messages_notes.php?msg_id=<?php echo $messages_row->question_id;?>&amp;var1=<?php echo $subcat;?>">Create PDF</a></td>
  </tr>
  <?php endwhile;?>
  <?php while($notes_row = $notes_res->fetch(PDO::FETCH_ASSOC)):?>
  <tr>
    <td><?php echo $notes_row[date]; ?></td>
    <td><?php echo substr($notes_row[notes], 0, 50).'...';?></td>
    <td><a href="pdf_messages_notes.php?note_id=<?php  echo $notes_row->sub_cat_id; ?>&var1=<?php echo $subcat;?>">View</a></td>
  </tr>
  <?php endwhile;?>
</table>
4

1 に答える 1

3

絶対にそうです。MySQL およびその他のリレーショナル データベースのリレーショナルな性質を考えると、PHP オブジェクトと mysql テーブルのコード表現を定義するのは非常に簡単です。この非常に単純なクラスを考えてみましょう:

<?php
    class Note {
        private $id
        private $text;
        private $insert_dt;
        private $update_dt;
    }
?>

これにより、コードの複製やコードベースの探索を必要とせずに、機能をより適切に整理して再利用できます。たとえば、すべてのページで特定の方法ですべてのノートの挿入日を印刷し始めたいとします。どうすればいいですか?サイトのすべてのページを変更しなければならない可能性があります。

セッターとゲッターを適切に定義すれば、これは非常に簡単な作業になります。書式設定された戻り文字列を 1 つの (非常に明白な) 場所で置き換えるだけで済みます。

<?php
    class Note {
        // ...
        public function getFormattedInsertDate() {
            return date( "M, Y", $this->insert_dt );
        }
    }
?>

確かに、これはすべて非常に過剰で、小規模では時間がかかるように見えます。OO の経験が豊富だった頃、大学時代に自分用の個人サイトを作成したことを覚えています。当時、私は PHP を学んでいましたが、サイトでは単に速度のためにインライン コードを使用する傾向がありました。それはうまく機能し、非常に高速で軽量でした。Web フレームワークが過度に「重い」と感じたため、私は Web フレームワークを介したハラバルーを理解していませんでした。

問題は、メンテナンス中に事後的に発生します。6 か月または数年後にコードに戻ると、この呼び出しがどこにあったのか、またはバグを修正するために 8 か所変更しなければならない理由を突き止めようとします。これらは、悪い結合 (コードベースの結束) によって引き起こされる感情です。

幸いなことに、この動作をサポートするだけでなく、奨励および強制するために、長年にわたって多くのフレームワークが生まれました。まだお持ちでない場合は、CakePHP または Code Igniter を調べることを強くお勧めします。これらはどちらも、これらの概念をしっかりと理解するための非常に簡単で無駄のないフレームワークであり、ブログ Web サイトの作成を順を追って説明するための優れた入門チュートリアルを提供します。

これが役立つことを願っています。何か見逃した場合はお知らせください。必要に応じて更新します。

于 2012-05-14T23:24:31.270 に答える