php重构和更好的PHP编码?

时间:2010-10-11 21:02:54

标签: php mysql performance refactoring code-readability

我有这个过程,这是我的应用程序的核心,即我创建,但由于某种原因,我觉得这是最糟糕的方式(本能),我想看看他们是否有问题这个过程我正以一种糟糕的方式接近它!附:代码工作正常,只是重构问题。

过程是:

用户访问主页,他们会看到其他网站成员(home.php)的最新活动,

 //function to bring the latest activities from database
   $results=function getUserUpdates($_SESSION['user_id'];


while($row = mysql_fetch_array($results))

      {
//another function to format the activities in a social stream
          echo formatUpdate($row['user_note'],$row['dt'],$row['picture'],$row['username'],$row['id'],$row['reply_id'],$row['reply_name'],$row['votes_up'],$row['votes_down']);


      }

我已将功能代码放入pastie。

formatUpdate function http://pastie.org/1213958

getUserUpdates function http://pastie.org/1213962

编辑这两个函数来自home.php中包含的不同文件, 来自functions.php的formatUpdate 来自queries.php的getUserUpdates

2 个答案:

答案 0 :(得分:2)

首先,您可以使用单独的函数来获取数据和格式化数据。这是重构代码的良好开端。它使将来更容易:如果您想要以不同方式格式化数据,您可以扩展格式化程序。

第二,这是lambda的核心意义:

$results=function getUserUpdates($_SESSION['user_id'];

删除function关键字。在定义函数时使用function。但在这里你只打电话给一个。 (您在queries.php中定义了它。)

第三次,我同意webbiedave关于echo语句。避免这种情况的好方法:在应用程序的“核心”中,将所有HTML收集到一个位置。然后,当您收集了要在页面上显示的所有内容时,您可以立即回显所有内容。这样可以更容易地跟踪您正在做的事情,并记住所有事情的顺序。它还可以更轻松地添加页眉和页脚,或进行更多格式设置。否则,如果您的代码周围散布着echo个陈述,那么让一些不应该出现的内容变得容易得多。

这是我的意思的一个非常基本的例子:

$html = '';
$results = getUserUpdates($_SESSION['user_id'];

while($row = mysql_fetch_array($results)) {
    $fields = array(
        'user_note' => $row['user_note'],
        'dt' => $row['dt'],
        'picture' => $row['picture'],
        'username' => $row['username'],
        'id' => $row['id'],
        'reply_id' => $row['reply_id'],
        'reply_name' => $row['reply_name'],
        'votes_up' => $row['votes_up'],
        'votes_down' => $row['votes_down'],
    );
    $html .= formatUpdate($fields);
}
// This way you can do whatever you want to $html here.
echo $html;

另请注意,我将$ row中的所有字段放入数组并将其传递给formatUpdate()。这有两个好处:

  1. 更容易阅读。
  2. 如果你曾经     想要改变那些领域     formatUpdate处理,你没有     不得不担心搜索     通过你的代码来改变     每次打电话都要参数。

答案 1 :(得分:1)

首先,我认为你的意思是:

$results = getUserUpdates($_SESSION['user_id']);

getUserUpdates()函数中有一个冗余分支:

if ($username == $_SESSION['u_name']){
    // return something
}

if ($username != $_SESSION['u_name']){
    // return something else
}

您不需要第二个if语句,因为此时运行的任何代码只会在$username != $_SESSION['u_name']时运行。

在我看来,通常最好不要让不同的函数直接在堆栈中回显HTML(例如echoVote())。函数返回数据并让原始调用者回显它是首选。这允许呼叫者在需要时执行额外的数据按摩。

除此之外,您的代码正在获取数据,循环并对结果采取行动,这几乎是标准票价。

我认为你的本能对自己有点过于苛刻;)有待改进,但这肯定不是做任何事情的最糟糕方式。