我正在尝试将整个<head>
部分作为自己的包含文件。一个缺点是标题和描述以及关键字是相同的;我无法弄清楚如何将参数传递给包含文件。
所以这是代码:
<?php include("header.php?header=aaaaaaaaaaaaaaaaaaaaa"); ?>
<body>
.....
..
.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content=" <?php $_GET["header"]?> " >
<meta name="Description" content=" <?php $_GET["header"]?> " >
<title> <?php $_GET["header"]?> </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
显然这不起作用;如何将参数传递给包含的文件?
答案 0 :(得分:92)
Include具有从中调用的行的范围。
如果您不想创建新的全局变量,可以使用函数包装include()
:
function includeHeader($title) {
include("inc/header.php");
}
只要您使用值$title
致电includeHeader
,就会在随附的代码中定义 includeHeader('My Fancy Title')
。
如果要传递多个变量,则始终可以传递数组而不是字符串。
让我们创建一个通用函数:
function includeFile($file, $variables) {
include($file);
}
瞧!
使用extract使其更加整洁:
function includeFileWithVariables($fileName, $variables) {
extract($variables);
include($fileName);
}
现在你可以做到:
includeFileWithVariables("header.php", array(
'keywords'=> "Potato, Tomato, Toothpaste",
'title'=> "Hello World"
));
知道它会导致变量$keywords
和$title
在包含的代码范围内定义。
答案 1 :(得分:48)
的index.php:
<?php
$my_header = 'aaaaaaaaaaaaaaaaaaaa';
include 'header.php';
?>
和header.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="shortcut icon" href="favicon.ico" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content=" <?php echo $my_header ?> " />
<meta name="Description" content=" <?php echo $my_header ?> " />
<title> <?php echo $my_header ?> </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
这不是一个理想的解决方案,但我知道这是你迈出的第一步。
PS。您的Doctype与代码不匹配。我已经将你的标题html调整为XHTML。
答案 2 :(得分:12)
您无法将参数传递给include
,但它可以访问您已设置的所有变量。来自include
documentation:
当包含文件时,它包含的代码将继承发生包含的行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。
因此:
<?php
$header = 'aaaaaaaaaaaaaaaaaaaaa';
include("header.php");
?>
<title> <?php echo $header; ?> </title>
答案 3 :(得分:2)
嗯,当您使用include时,您只需设置一个要使用的变量:
<?php
$var = "Testing";
include("header.php");
?>
在您的标头文件中:
<?php
echo $var;
?>
允许您之前定义的变量可用于您拥有的任何包含。
答案 4 :(得分:2)
你在想它
<?php
$header = "aaaaaaaaaaaaaaaaa";
include("header.php");
?>
:: EDIT ::
决定我会增加价值
包含的文件将获得您包含它的范围。因此,如果您在函数中包含一个文件:
<?php
$get_me = "yes";
function haha()
{
include("file.php");
}
haha();
// And file.php looks like
echo $get_me; // notice + blank
?>
此外,您不止一次地包含同一个文件,效果很好。
<?php
$output = "this";
include("cool_box.php");
$output = "will";
include("cool_box.php");
$output = "work";
include("cool_box.php");
?>
甚至可以使用它来加载成为类中方法一部分的模板。所以你可以这样做:
<?php
class template
{
private $name;
function __construct($name)
{
$this->name = preg_replace("/[^a-zA-Z0-9]/", "", $name);
}
function output(array $vars)
{
include($this->name.".php"); // Where $vars is an expected array of possible data
}
}
$head = new template("header");
$body = new template("body");
$head->output();
$head->output(array("content" => "this is a cool page"));
?>
答案 5 :(得分:2)
在include()
之前将变量定义为伪参数/变通方法 - 正如许多人所推荐的那样 - 是一个坏主意。它在全局范围内引入了一个变量。在包含的文件中定义一个函数,而不是捕获你想传递的参数。
答案 6 :(得分:1)
这是一种很好的方法。然而,我会在里面做一点。定义布局,网页的包装器并将您的内容文件包含在其中:
layout.phtml
<html>
<head>
... your headers go here
</head>
<body>
<? include $content ?>
</body>
</html>
您的内容模板文件可能如下所示。
content.phtml
<h1>hello world</h1>
<p>My name is <?= $name ?></p>
然后,您将拥有将处理逻辑,连接到数据库等的主脚本(索引)。
index.php
$content = 'content.phtml';
$name = 'Marc'; //Can be pulled from database
include 'layout.phtml';
通过这种方式,您可以很好地分离业务逻辑和表示。它可以帮助您剪切页面部分的重复代码,如徽标或导航,在整个网站上重复。
答案 7 :(得分:0)
如果包含文件,就像将该代码插入父文件一样。你可以这样做:
<?php
$parameter = "Hello World";
include("header.php");
?>
然后在header.php
<?php
$parameter = isset($parameter) ? $parameter : "Default Text";
// Use accordingly
?>
我使用isset()
方法验证它是否已有值并已实例化。
答案 8 :(得分:0)
我注意到没有人建议使用模板引擎。我来这里看是因为对于我正在使用的项目,模板引擎是不可能的,这可能也是你的情况,但我认为值得一提的是:Twig(我的首选引擎)和Smarty都允许将特定变量传递给包含。
我高度建议尽可能使用模板引擎,因为它简化了前端代码,在前端和后端之间添加了一层抽象,Twig和Smarty都自动清理您传递给它们的变量有助于缓解XSS攻击。
Twig示例
了header.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content="{{ header }}" >
<meta name="Description" content="{{ header }}" >
<title> {{ header }} </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
的index.html
{% include 'header.html' with { 'header' : '<script>alert("this shouldnt work")</script>'} only %}
Body Text
{% include 'footer.html' %}
Smarty示例
header.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<link rel="shortcut icon" href="favicon.ico">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content="{$header}" >
<meta name="Description" content="{$header}" >
<title> {$header} </title>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
</head>
在index.tpl
{include 'header.tpl' header='<script>alert("this shouldnt work")</script>'}
Body Text
{include 'footer.tpl'}