如何将参数传递给包含的文件?

时间:2010-11-30 15:17:57

标签: php include

我正在尝试将整个<head>部分作为自己的包含文件。一个缺点是标题和描述以及关键字是相同的;我无法弄清楚如何将参数传递给包含文件。

所以这是代码:

的index.php

<?php include("header.php?header=aaaaaaaaaaaaaaaaaaaaa"); ?>

<body>
.....
..
.

的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">
<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>

显然这不起作用;如何将参数传递给包含的文件?

9 个答案:

答案 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

  

当包含文件时,它包含的代码将继承发生包含的行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。

因此:

的index.php

<?php
$header = 'aaaaaaaaaaaaaaaaaaaaa';
include("header.php");
?>

的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'}