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。
是否可以使用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。