我想将html导航放到一个单独的php文件中,因此当我需要对其进行编辑时,只需要对其进行一次编辑即可。当我要将活动类添加到活动页面时,问题就开始了。
我有三页和一个普通文件。
common.php:
<?php $nav = <<<EOD <div id="nav"> <ul> <li><a <? if($page == 'one'): ?> class="active"<? endif ?> href="index.php">Tab1</a>/</li> <li><a href="two.php">Tab2</a></li> <li><a href="three.php">Tab3</a></li> </ul> </div> EOD; ?>
index.php: 除了每页的$ page不同之外,所有三个页面都是相同的。
<?php $page = 'one'; require_once('common.php'); ?> <html> <head></head> <body> <?php echo $nav; ?> </body> </html>
除非我在每页上放置导航,否则这根本行不通,但是将导航与所有页面分开的整个目的就毁了。
我想实现的目标甚至有可能吗?我究竟做错了什么?
谢谢
编辑:这样做时,li内的php代码似乎没有运行,它只是像是html一样被打印
您的index.php代码正确。我将在下面包含common.php的更新代码,然后我将解释它们之间的区别。
<?php $class = ($page == 'one') ? 'class="active"' : ''; $nav = <<<EOD <div id="nav"> <ul> <li><a $class href="index.php">Tab1</a>/</li> <li><a href="two.php">Tab2</a></li> <li><a href="three.php">Tab3</a></li> </ul> </div> EOD; ?>
第一个问题是,您需要确保heredoc的结束声明EOD;-根本没有缩进。如果缩进,则会出现错误。
EOD;
至于您的PHP代码未在heredoc语句中运行的问题,那是因为您看错了。使用heredoc语句与关闭PHP标记不同。因此,您无需尝试重新打开它们。那对您无济于事。Heredoc语法的工作方式是,打开和关闭之间的所有内容均按所显示的完全一样,但变量除外。这些将替换为关联的值。我从heredoc中删除了您的逻辑,并使用一个三级函数来确定该类,以使其更易于查看(尽管我不相信任何逻辑语句仍然可以在heredoc中使用)
要了解Heredoc语法,它与在双引号(“)中包含它相同,但是不需要转义。因此,您的代码也可以这样编写:
<?php $class = ($page == 'one') ? 'class="active"' : ''; $nav = "<div id=\"nav\"> <ul> <li><a $class href=\"index.php\">Tab1</a>/</li> <li><a href=\"two.php\">Tab2</a></li> <li><a href=\"three.php\">Tab3</a></li> </ul> </div>"; ?>
它将做完全相同的事情,只是编写方式有所不同。Heredoc和字符串之间的另一个区别是,您可以在中间无法进入Heredoc的字符串中跳出。使用此逻辑,可以生成以下代码:
<?php $nav = "<div id=\"nav\"> <ul> <li><a ".(($page == 'one') ? 'class="active"' : '')." href=\"index.php\">Tab1</a>/</li> <li><a href=\"two.php\">Tab2</a></li> <li><a href=\"three.php\">Tab3</a></li> </ul> </div>"; ?>
然后,您可以像最初想要的那样直接在字符串中包含逻辑。
无论选择哪种方法,脚本的性能差异都很小(如果有的话)。它主要归结为偏好。无论哪种方式,您都需要确保了解它们的工作原理。