【问题标题】:PHP OOP vs Inline [closed]PHP OOP 与内联 [关闭]
【发布时间】:2012-05-22 11:04:59
【问题描述】:

我正在拼命地朝着 OOP 方向发展,但我不知道什么时候使用它。我得到了机制,但何时使用它们只是不点击。我很好奇我目前的情况是否适合 OOP 方法。

我有 3 页。 Details.php 显示两个并排的 div。一个用户可以添加注释,另一个可以查看存储在 MySQL 中的以前的注释。他们可以通过 Details.php 中的 AJAX 功能添加注释和提取注释。 javascript 函数调用 add_notes.php 向数据库添加注释,并调用 load_notes.php 通过 Jquery .load() 在页面上加载注释以及提交新注释以刷新 div。

我是新手,但我从骨子里觉得有更好的方法来组织这段代码。我会研究一个框架,但我已经深入到这个项目中,所以正在寻找关于如何更好地分解它或验证我正在以尽可能简化的方式进行它的 OOP 想法。所有 cmets 都有帮助!

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

【问题讨论】:

  • 此时我不会太担心它。总有改进的方法,但你所做的还不错。很高兴看到您正在使用 PDO!
  • ...但是为什么是随机的mysql_fetch_object
  • 而这个问题更适合codereview.stackexchange.com,这里就不多说了。
  • 谢谢保罗。在走得太远之前,我想检查一下我是否走在正确的轨道上。 Deceze 我有人帮我用过所有东西。我正在将此代码移至 PDO 并移至普通数组。经过一些研究,我不相信出于任何特定原因我需要使用 fetch_object。似乎没有害处,只是没有必要。希望我没有错。
  • 从来不知道 codereview 的存在。我会检查一下。感谢您的提醒。

标签: php jquery oop


【解决方案1】:

绝对是。鉴于 MySQL 和其他关系数据库的关系性质,很容易定义 PHP 对象和 mysql 表的代码表示。考虑这个过于简单的类:

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

这让您可以更好地组织和重用功能,而无需重复代码或在您的代码库中搜寻。例如,假设我想开始以特定方式在所有页面上打印出每条笔记的插入日期。我该怎么做?我可能不得不更改网站上的每个页面。

如果我们正确定义了 setter 和 getter,这将成为一项极其简单的任务。我应该只需要在 1 个(非常明显的)位置替换格式化的返回字符串:

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

诚然,这一切在小范围内似乎都非常过度且耗时。我记得当我有丰富的 OO 经验时,我在大学里为自己建立了一个个人网站。当时我正在学习 PHP,对于这个网站,我倾向于使用内联代码来提高速度。它运行良好,非常快速且轻巧。我不理解网络框架的喧嚣,因为它们感觉过于“沉重”。

这些问题是在维护期间出现的。当您在 6 个月或几年后返回代码时,您会尝试找出此调用在哪里,或者为什么您必须在 8 个地方更改它以修复错误。这些是由于代码库中的不良耦合 - 内聚引起的感受。

幸运的是,多年来涌现出许多框架,不仅支持而且鼓励和强制执行这种行为。如果您还没有,我强烈建议您研究 CakePHP 或 Code Igniter。它们都是非常容易精益的框架,可以很好地确定这些概念,并提供出色的介绍性教程来引导您创建博客网站。

我希望这会有所帮助。如果我遗漏了什么,请告诉我,我会根据需要进行更新。

【讨论】:

  • 感谢本的帮助!因此,在我的示例中,您会将所有内容移至一个班级?您是否会将 javascript 和所有内容汇总到一个类中,然后调用 echo $newnote->show_notes();在您的主页上?天哪,我觉得我已经接近理解何时使用类,但由于某种原因无法完全实现。
  • 真正的目标是进入模型-视图-控制器,但为了简化,我想说如果您从数据库中提取,该表应该有一个类。将您的客户端语言(html、css、js)保存在它们自己的文件中。当您需要数据时,按照您的建议,只需引用该类即可。
  • 好的,这很有帮助。谢谢!我希望我会从一个框架开始,但我没想到我的第一个项目会这么大。现在我已经膝盖深,我需要找到朝着正确方向前进的方法。建议很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多