【问题标题】:How to make this code more readable如何使这段代码更具可读性
【发布时间】:2011-05-13 16:57:37
【问题描述】:

这是 php 代码的一部分,它使用 contentArray,它是一个 JSON,并为用户生成 UI,它生成 html 标签,而且,它也生成 js 代码......它可以工作,但我认为代码很难阅读和维护,有什么想法吗???谢谢。

for($i = 0; $i < count($contentArray); $i++){  

    if($i %2 == 0){
       echo ("<li class='even_row'>");
    }else{
       echo ("<li class='odd_row'>");
    }  
    $content = $contentArray[$i];    

    echo("<textarea class='userdata' id='user_data_textarea_".$content->{'m_sId'}."'>");
    echo($content->{'m_sDataContent'});  
    echo("</textarea>"); 

echo("</li>");   

    echo("<script type='text/javascript'>");

    echo("$('#user_data_textarea_".$content->{'m_sId'}."').bind('keydown', function(e){");  
    echo("  TypingHandler.handleTypingInUserDataTextArea(".$content->{'m_sId'}.", e);");
    echo(" });");    

    echo("</script>");

}            

【问题讨论】:

  • 我将为偶数或奇数类名创建变量,所有内联内容都来自顶部的数据库。然后使用变量名将所有 echo 语句放在底部。但它的方式并不算太糟糕。
  • 哇,所有这些答案都没有赞,哈哈
  • 问题:让代码更具可读性?答案:更糟糕的代码......

标签: php readability code-readability


【解决方案1】:

首先对于您的奇偶样式,不需要一个类,只需使用 css

here is info on that

然后在 php 中只在一行中回显您需要的内容

$count = count($contentArray);
for($i = 0; $i < $count; $i++){  
    $content = $contentArray[$i];    
    echo('<li><textarea class="userdata" id="user_data_textarea_"'.$content->{'m_sId'}.'">'.$content->{'m_sDataContent'}.'</textarea></li>');   
}

让我们把jquery放在远离php的html页面中

我们可以通过使用starts with selector得到每个项目

$('[id^=user_data_textarea_]').bind('keydown', function(e){  
    var id = this.id.str_replace("user_data_textarea","");
    TypingHandler.handleTypingInUserDataTextArea(id, e);
});    

【讨论】:

  • edit:删除了 uneed 类并交换了引号,这样您的结果中就会有有效的 html
【解决方案2】:

关于“for”循环的一个提示,您应该在循环之前计算 $contentArray 的计数。每次循环执行时,它都必须调用该函数。

$count = count($contentArray);

for ($i=0; $i<count; $i++) {
// ...
}

【讨论】:

    【解决方案3】:

    你可以试试真正的 HTML:

    <?php
    for($i = 0; $i < count($contentArray); $i++){  
      $rowClass = $i %2 == 0 ?'even_row' : 'odd_row';
    ?>
        <li class='<?= $rowClass ?>'>
          <textarea class='userdata' id='user_data_textarea_<?=$content->{'m_sId'}?>'>
            <?= $content->{'m_sDataContent'} ?>
          </textarea>
        </li>
        <script type='text/javascript'>
        //etc...
        </script>
    <?php } ?>
    

    【讨论】:

      【解决方案4】:

      它应该看起来像这样,以便在 IDE 中获得更好的可读性。

      <?php
      foreach($contentArray as $content){
          ?>
          <li>
              <textarea class="userdata" id="user_data_textarea<?php echo htmlentities($content['m_sId']); ?>">
                  <?php echo htmlspecialchars($content['m_sDataContent']); ?>
              </textarea>
              <script type="text/javascript">
                  $('#user_data_textarea_<?php echo htmlspecialchars($content['m_sId']); ?>').bind('keydown',function(e){
                      TypingHandler.handleTypingInUserDataTextArea('<?php echo htmlspecialchars($content['m_sId']); ?>',e);
                  });
              </script>
          </li>
      <?php
      }
      

      【讨论】:

      • 另外,当您使用 ?> 跳出 PHP 并编写 HTML 时,它在 IDE 中看起来更好,而不是使用 echo 语句。然后使用 重新输入 PHP
      【解决方案5】:

      您可以从 echo 语句中删除 ( ),它们不是必需的,可能有助于使其看起来更整洁...

      【讨论】:

        【解决方案6】:

        这对我来说实际上看起来很容易理解;我可以毫不费力地弄清楚你在做什么。我建议的唯一区别是将ternary operators 用于行类:

        echo "<li class='".( ($i%2 == 0) ? "even" : "odd" )."_row'>";
        

        ...但这只是我,有些人会觉得这更令人困惑,而不是更少。我个人喜欢将所有内容放在一行中。

        【讨论】:

          【解决方案7】:

          个人,我喜欢用printf在php中写html代码。它可能看起来像:

          for($i = 0; $i < count($contentArray); $i++){  
          
              printf("<li class='%s'>", $i % 2 ? "odd_row" : "even_row"); 
              $content = $contentArray[$i];    
          
              printf("<textarea class='userdata' id='user_data_textarea_%s'>%s</textarea>",
                  $content->{'m_sId'},
                  $content->{'m_sDataContent'});
          
              echo("</li>");   
          
              echo("<script type='text/javascript'>");
          
              printf("$('#user_data_textarea_%1$s').bind('keydown', function(e){
                  TypingHandler.handleTypingInUserDataTextArea(%1$s, e);
                   });",
                  $content->{'m_sId'});     
          
              echo("</script>");
          
          }    
          

          【讨论】:

            【解决方案8】:
            <?php
                foreach($contentArray as $content){
                    $class = ($i %2 == 0) ? "even_row": "odd_row"; ?>
                    <li class="<?php echo $class ?>">
                        <textarea class='userdata' id='user_data_textarea_<? echo $content['m_sId'] ?>'>
                            <? php echo $content['m_sDataContent'] ?>
                        </textarea>
                    </li>
                    <script type='text/javascript'>
                        $('#user_data_textarea_<?php echo content['m_sId'] ?>').bind('keydown', function(e){
                            TypingHandler.handleTypingInUserDataTextArea(<?php $content['m_sId'] ?>, e);
                        });
                    </script>
            <?php } // end foreach ?>
            

            【讨论】:

              【解决方案9】:

              jQuery 代码应该已经在 HTML 中,使用一些主选择器而不是一一绑定元素,这对我来说没有意义。这应该澄清你的代码。

              for($i = 0; $i < count($contentArray); $i++){  
                  $content = $contentArray[$i];    
              
                  echo "<li class='" . (($i %2 == 0) ? "even_row" : "odd_row") . ">";
                      echo "<textarea class='userdata' id='user_data_textarea_".$content->{'m_sId'}."'>";
                      echo $content->{'m_sDataContent'};  
                      echo "</textarea>"; 
                  echo "</li>";   
              }      
              

              添加

              一般情况:

              $(function() {
                  $('.userdata').click(function() {
                      some_function($(this).attr('id');
                  });
              })
              

              也就是说,使用类选择器绑定,后期使用一些唯一标识符来完成这项工作。

              【讨论】:

              • 但是我的jquery是基于不同的id,有不同的行为,你能表达得更详细吗?
              【解决方案10】:

              将所有内容放入数组中,然后在循环结束时回显它们。

              // Put each item in the array, then echo at the end
              $items = array();
              $js = array();
              
              // I'm assuming that your content array has numeric keys
              // if not, use the for statement from your original code
              foreach ($contentArray as $i => $content) 
              {
                  // using sprintf
                  $items[] = sprintf('<li class="%s_row"><textarea class="userdata" id="user_data_textarea_%s">%s</textarea></li>'
                      , ($i % 2) ? 'even' : 'odd'
                      , $content->m_sId
                      , $content->m_sDataContent
                  );
              
                  // or just plain old concatenation
                  $js[] = "$('#user_data_textarea_{$content->m_sId}').bind('keydown', function(e){TypingHandler.handleTypingInUserDataTextArea({$content->m_sId}, e);});";
              }
              
              echo "<ul>" . join("\n", $items) . "</ul>\n"
                  . '<script type="text/javascript">' . join("\n", $js) . "</script>\n";
              

              【讨论】:

                【解决方案11】:

                使用例如smarty 分隔您的内容和代码。它在短期内需要一些基础设施投资,但从长远来看会改善维护。

                反映了 cmets,让我们将 PHP 视为一种真正的模板语言。

                $contentCount = count($contentArray);
                for($i = 0; $i < $contentCount; $i++)
                {
                    $rowType = ( $i % 2 ) ? 'even' : 'odd';
                    $content = $contentArray[$i];
                    echo <<<EOT
                <li class='{$rowType}_row'>
                    <textarea class='userdata' id='user_data_textarea_{$content->m_sId}'>
                        {$content->m_sDataContent}
                    </textarea>
                
                </li>
                <script type="text/javascript">
                    $('#user_data_textarea_{$content->m_sId}').bind('keydown', function(e)
                    {
                        TypingHandler.handleTypingInUserDataTextArea({$content->m_sId}, e);
                    }
                </script>
                EOT;
                }
                

                【讨论】:

                • 我对这个问题持观望态度。虽然我以前使用过它并且它是一个出色的模板系统,但有一些很好的论据表明 php 已经是一个模板系统,添加 Smarty 之类的东西只是让你用 { ... } 替换 &lt;?php ... ?&gt;,增加了缺点增加处理时间。
                • 有趣的观点,但我会说阅读 smarty 模板比“phtml”容易得多
                • 我同意 eykanal 的观点。为什么不将模板分离到其他文件中并将其视为模板(将视图与其他文件分开)?当然,PHP 本身就是一种模板语言。它只需要正确实施。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-07-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-09-12
                • 1970-01-01
                相关资源
                最近更新 更多