PHP的require可以同时require head和body吗?

Can PHP's require be used to require the head and body at the same time?

是否可以使用PHP在一个页面包含<body>的内容,并添加到另一页的<body>,同时做同样的事情对于 header?还是使用两个页面更容易/更好?这就是我想要的:

一些页面

<html>
<head>
 - nav.php's header -
 - stuff special to Some Page -
</head>
<body>
 - nav.php's body -
 - content special to Some Page -
</body>
</html>

我知道 require 语句可用于获取文件的全部内容。是否有某种“合并”语句将页面合并在一起?

由于您将 nav.php 包含在 index.php<body> 中,因此 nav.php 不应包含 <html> 等标签,因为那样会导致在不符合 HTML 规范的最后一页中。

使用您的示例,这是将由浏览器接收的 index.php 页面的内容:

<!DOCTYPE HTML>

<html>
<head>
<title>Title</title>
<style>
 - styles for index.php -
</style>
</head>
<body>

<!DOCTYPE HTML>

<html>
<head>
<style>
 - Style for navigation menu -
</style>
</head>
<body>
<h1>Title</h1>
<nav>
 - Navigation -
</nav>
</body>
</html>

<content>
 - content here -
</content>
</body>
</html>

如您所见,您的最终页面包含多个 <!DOCTYPE> 标签、多个 <html> 标签等。

nav.php 应该只包含您希望包含在最终页面那部分的标签。 所以您的 nav.php 应该看起来更像这个:

<nav>
 - Navigation -
</nav>

至于您在 index.php 中的样式,您应该有一个 <link> 标签,它可以引入外部样式 sheet,例如<link rel="stylesheet" href="style.css">。所有页面的所有 CSS 都将进入 style.css

如果您依赖 PHP 中包含文件的内联行为,您将 运行 陷入各种安全、re-use 和维护问题。但是如果你坚持一些简单的规则,你可以避免这些问题:

  • 任何由 PHP 打开的 HTML 标签必须在同一范围内关闭(即函数)
  • 包含的文件只能包含命名空间、常量、函数和对象定义或进一步的 include/require 语句(但最好使用自动加载器)。

所以将这些应用到上面的基本页面,并遵守将 includes/requires 放在页面顶部的既定良好做法....

<?php
// always start your page with a PHP block - it makes interfering with the headers
// much less painful

require_once('nav.inc.php');

function local_head_content()
{
  ...
}

function local_body_content()
{
   ...
}
?>
<html>
<head>
 <?php 
   nav_head_content();
   local_head_content(); 
 ?>
</head>
<body>
 <?php
   nav_body_content();
   local_body_content();
</body>
</html>

但从导航内容中调用 local_head_content() / local_body_content() 作为 callbacks 可能会更好。

(是的,即使没有函数调用,也可以按照您的要求进行操作 - 但这是一个非常糟糕的主意,这就是为什么我没有解释如何执行此操作的原因)。

解决跨不同文件共享内容问题的一种更传统的方法是使用 front controller pattern - instead of the webserver selecting the page specific content, this is done in the PHP code with all URLs pointing to the same entry script