【问题标题】:php refactoring and better coding for php?php 重构和更好的 php 编码?
【发布时间】:2026-01-16 15:30:01
【问题描述】:

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

过程是:

用户去主页,他们看到他们的最新活动,由其他网站成员(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']);


      }

我已经把函数代码放在了paste中。

格式更新函数http://pastie.org/1213958

getUserUpdates 函数http://pastie.org/1213962

EDIT 这两个函数来自不同的文件,它们包含在 home.php 中, 来自functions.php的格式更新 从 query.php 获取用户更新

【问题讨论】:

  • 您能否详细说明您不喜欢当前流程的哪些方面?如果您无法具体确定问题,那么就没有什么需要解决的了。
  • 这不是有效的 PHP。您不能像在该代码中尝试那样创建闭包/ lambda,并且您缺少括号。在你告诉我们它有效之前,先测试一下。 ;)
  • 对不起,我错过了,但它的工作,再次抱歉,我不明白你所说的 lambda/cosure 的意思。
  • 他的意思是$results=function getUserUpdates($_SESSION['user_id'];这行会导致语法错误。发布的代码不会解析。
  • 哦,好吧,对不起,我在*上打错了,但在我的代码中,括号是他们的

标签: php mysql performance refactoring code-readability


【解决方案1】:

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

第二,这就是 coreyward 所说的 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 处理,你不处理 不得不担心搜索 通过您的代码更改 每次调用它的参数。

【讨论】:

  • 哦,天哪,非常感谢,该代码更易于阅读和清理,我现在喜欢我的代码;)),我知道我的代码很丑,哈哈谢谢@willel +1 的支持我
【解决方案2】:

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

$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())。最好让函数返回数据并让原始调用者回显它。如果需要,这允许调用者执行额外的数据按摩。

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

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

【讨论】:

  • 非常感谢,我完全理解你所说的,但是我没有得到你所说的关于 echovote 功能的内容,我应该删除该功能并在 formatupdate 函数中进行处理! :)),哈哈,我对自己并不苛刻,但是我看到其他人编写了一些非常好的代码,而且我是新手,所以我有这种感觉!!
  • 另外我需要知道改进:))) 我喜欢完美
  • 我的意思是让函数返回 html,而不是直接从函数中回显 html。但现在不用担心。这只是一个需要牢记的偏好。