有没有更好的方法来编写这段PHP代码?

有没有更好的方法来编写这段PHP代码?,php,Php,我的PHP站点包含包含在INDEX.PHP页面中的页眉、正文和页脚文件。 在header.php文件中,我有这样一个菜单 <div id="bottomrow"> <div class="pad"> <ul class="menu left"> <li class="first <?=$current_home?>"><a href="/"><em>Ho

我的PHP站点包含包含在INDEX.PHP页面中的页眉、正文和页脚文件。
在header.php文件中,我有这样一个菜单

    <div id="bottomrow"> 
      <div class="pad"> 
        <ul class="menu left">
          <li class="first <?=$current_home?>"><a href="/"><em>Home</em></a></li>
          <li class="users drop <?=$current_users?>"><a href=""><em>Users</em></a><span class="drop">&nbsp;</span> 
            <ul id="moreheader">
                <li></li>
                <li></li>

            </ul>
          </li>
          <li class="<?=$current_forum?>"><a href=""><em>Forums</em></a></li>
          <li class="drop <?=$current_more?>"><a href="/moreheader"><em>More</em></a><span class="drop">&nbsp;</span> 
            <ul id="moreheader">
              <li><a href=""><em>Widgets</em></a></li>
              <li><a href=""><em>News</em></a></li>
              <li><a href=""><em>Promote</em></a></li>
              <li><a href=""><em>Development</em></a></li>
              <li><a href=""><em>Bookmarks</em></a></li>
              <li><a href=""><em>About</em></a></li>
            </ul>
          </li>
          <li class="moneytabmenu <?=$current_money?>"><a href="/moneytabmenu"><em>Money:<span class="moneytabmenu-total">$0.00</span></em></a></li>
        </ul>
        <ul class="menu right">
          <li class="drop myaccount <?=$current_myaccount?>"><a href="" class="first"><img class="avatar" src="http://gravatar.com/avatar.php?gravatar_id=7ab1baf18a91ab4055923c5fd01d68a2&amp;rating=pg&amp;size=80&amp;default=" height="19" width="19" alt="you" /><em>My 
            Account</em></a><span class="drop">&nbsp;</span> 
            <ul id="myaccount">
              <li><a href=""><em>Dashboard</em></a></li>
              <li><a href=""><em>Account Settings</em></a></li>
              <li><a href=""><em>Settings</em></a></li>
            </ul>
          </li>
          <li class="drop"><a href=""><em>Mail</em></a><span class="drop">&nbsp;</span> 
            <ul id="mailboxheader">
              <li><a href=""><em>InBox</em></a></li>
              <li><a href=""><em>SentBox</em></a></li>
              <li><a href=""><em>Trash</em></a></li>
              <li><a href=""><em>Post Bulletin</em></a></li>
              <li><a href=""><em>View Bulletins</em></a></li>
            </ul>
          </li>
          <li class="drop <?=$current_more?>"><a href=""><em>More</em></a><span class="drop">&nbsp;</span> 
            <ul id="moreheader">
              <li><a href=""><em>Widgets</em></a></li>
              <li><a href=""><em>News</em></a></li>
              <li><a href=""><em>Promote</em></a></li>
              <li><a href=""><em>Development</em></a></li>
              <li><a href=""><em>Bookmarks</em></a></li>
              <li><a href=""><em>About</em></a></li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
    <!-- END div#bottomrow -->
  </div> 

HTML不能进一步简化,但PHP可能做得更好。使用全局变量通常不是一个好主意,但您可能可以这样做:

function current_tab($page) {
    global $p;
    // Check if $page is a prefix for $p
    if ($page == substr($p, 0, strlen($page))) {
        return "current";
    }
}
然后在HTML中,使用以下命令:

<?=current_tab('account');?>


对于不一致的页面名称,您需要使用特殊条件,或者您可以更改命名约定。

您的HTML不能进一步简化,但PHP可能做得更好。使用全局变量通常不是一个好主意,但您可能可以这样做:

function current_tab($page) {
    global $p;
    // Check if $page is a prefix for $p
    if ($page == substr($p, 0, strlen($page))) {
        return "current";
    }
}
然后在HTML中,使用以下命令:

<?=current_tab('account');?>


对于不一致的页面名称,您需要使用特殊条件,或者您可以更改命名约定。

首先,我建议创建一个菜单类来处理此菜单的创建,并在index.php中调用class方法。这会将代码与表示分离,提供抽象,等等。当您调用它时,您可以将其传递给页面,类负责实现并将完整的菜单传递回

第二,我建议使用switch语句,而不是if…else语句,其中包含大量的or条件。您可以通过不包含break关键字来级联案例:

switch( $page) {
  case: 'home':
    $current_home = 'current';
    break;
  case: 'users.online':
  case: 'users.location':
  case: 'users.featured':
  .......
    $current_users = 'current';
    break;
}

就PHP的使用而言,您使用的并不多。正如我在if语句中所说的,我认为一个开关会做得更好,$page将被评估一次并匹配一次,不同于每个if。如果您可以为菜单使用一个循环,它可以减少代码中实际文本HTML的数量。如果您创建了数组来保存每个主菜单项(可能是其他菜单项的意思),那么您可以在数组上循环并组合数组内容、一些html和变量来创建菜单系统。减少文本HTML,更有效地使用PHP。

首先,我建议创建一个菜单类来处理此菜单的创建,并在index.PHP中调用类方法。这会将代码与表示分离,提供抽象,等等。当您调用它时,您可以将其传递给页面,类负责实现并将完整的菜单传递回

第二,我建议使用switch语句,而不是if…else语句,其中包含大量的or条件。您可以通过不包含break关键字来级联案例:

switch( $page) {
  case: 'home':
    $current_home = 'current';
    break;
  case: 'users.online':
  case: 'users.location':
  case: 'users.featured':
  .......
    $current_users = 'current';
    break;
}

就PHP的使用而言,您使用的并不多。正如我在if语句中所说的,我认为一个开关会做得更好,$page将被评估一次并匹配一次,不同于每个if。如果您可以为菜单使用一个循环,它可以减少代码中实际文本HTML的数量。如果您创建了数组来保存每个主菜单项(可能是其他菜单项的意思),那么您可以在数组上循环并组合数组内容、一些html和变量来创建菜单系统。减少HTML文字量,提高PHP的使用效率。

这里有很多可以改进的地方(可维护性和可扩展性都很低),但我首先要消除一些条件。。。例如,在第一个示例中,您可以检查字符串是否以“users”开头,这将处理“user”的所有特定情况

if(strpos($p, 'users') !== false) { ... }
其他一些情况也是如此


无论如何,我建议您看看服务器端脚本结构。通常,您可以找到一个更通用的解决方案。

这里有很多您可以改进的地方(可维护性和可扩展性非常低),但我首先要消除一些条件。。。例如,在第一个示例中,您可以检查字符串是否以“users”开头,这将处理“user”的所有特定情况

if(strpos($p, 'users') !== false) { ... }
其他一些情况也是如此


无论如何,我建议您看看服务器端脚本结构。通常,你可以找到一个更通用的解决方案来解决这个问题。

我建议让整个过程更加数据驱动。创建菜单选项的多维数组,然后遍历该数组,输出正确的HTML

以下是我将如何做到这一点(这一点还没有经过测试,但这一想法正是我试图传达的):



    我建议让整个过程更加数据驱动。创建菜单选项的多维数组,然后遍历该数组,输出正确的HTML

    以下是我将如何做到这一点(这一点还没有经过测试,但这一想法正是我试图传达的):

    
    

      我建议看一看像CodeIgniter这样的MVC框架(尽管PHP领域有很多,但CI是我的选择)


      你正在从一开始就写你自己的东西的路上。。。使用像CI这样的框架,您可以重复使用几乎所有现有的逻辑,并且只需稍微改变它的结构即可获得清晰的关注点分离和可靠的模板

      我建议看看像CodeIgniter这样的MVC框架(虽然PHP领域有很多,但CI是我的选择)


      你正在从一开始就写你自己的东西的路上。。。使用像CI这样的框架,您可以重复使用几乎所有现有的逻辑,并且只需稍微改变它的结构即可获得清晰的关注点分离和可靠的模板

      创建菜单类确实是那些“更通用的解决方案”中的一个(可能是最值得注意的);-)只是要小心不要意外地弄糟一个失败的案例,这可能是几个小时痛苦的调试时间;D创建菜单类确实是那些“更通用的解决方案”中的一个(可能是最值得注意的);-)只是要小心,不要意外地把一个案子搞砸了,它可能会持续几个小时