Как передать аргументы во включаемый файл? - PullRequest
37 голосов
/ 30 ноября 2010

Я пытаюсь сделать весь раздел <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 ]

92 голосов
/ 31 марта 2011

Включить имеет область видимости строки, из которой он вызван.

Если вы не хотите создавать новые глобальные переменные, вы можете обернуть include() функцией:

function includeHeader($title) {
    include("inc/header.php");
}

$title будет определяться во включенном коде всякий раз, когда вы вызываете includeHeader со значением, например includeHeader('My Fancy Title').

Если вы хотите передать более одной переменной, вы всегда можете передать массив вместо строки.

Давайте создадим универсальную функцию:

function includeFile($file, $variables) {
    include($file);
}

Voila!

Использование extract делает его еще более аккуратным:

function includeFileWithVariables($fileName, $variables) {
   extract($variables);
   include($fileName);
}

Теперь вы можете сделать:

includeFileWithVariables("header.php", array(
    'keywords'=> "Potato, Tomato, Toothpaste",
    'title'=> "Hello World"
));

Зная, что это приведет к тому, что переменные $keywords и $title будут определены в объеме включенного кода.

48 голосов
/ 30 ноября 2010

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>

Это не идеальное решение, но я понимаю, что ваши первые шаги в php.

PS.Ваш Doctype не соответствует коду.Я изменил ваш заголовок HTML на XHTML.

12 голосов
/ 30 ноября 2010

Вы не можете передавать аргументы include, но он имеет доступ ко всем переменным, которые вы уже установили.Из документации include :

Когда файл включен, содержащийся в нем код наследует переменную область видимости строки, в которой происходит включение.Любые переменные, доступные в этой строке в вызывающем файле, будут доступны в вызываемом файле, начиная с этого момента.

Таким образом:

index.php

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

header.php

<title> <?php echo $header; ?> </title>
2 голосов
/ 30 ноября 2010

определение переменной в качестве псевдо-аргумента / обходного пути перед include() - как это рекомендуется многими - плохая идеяон вводит переменную в глобальной области видимости.вместо этого определите функцию во включаемом файле, чтобы перехватить аргументы, которые вы хотите передать.

2 голосов
/ 30 ноября 2010

Вы слишком обдумываете это

<?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"));

?>
2 голосов
/ 30 ноября 2010

Хорошо, когда вы используете include, вы можете просто установить переменную для использования:

<?php
  $var = "Testing";
  include("header.php");
?>

В вашем заголовочном файле:

<?php
  echo $var;
?>

Разрешить использование ранее определенных переменных в любом включении.

1 голос
/ 30 ноября 2010

Это хороший подход. Однако я бы сделал это немного наизнанку. Определите макет, обертку для своей веб-страницы и включите в нее свой файл содержимого:

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';

Таким образом, вы можете красиво разделить бизнес-логику и представление. И это может помочь вам сократить повторяющийся код для таких частей страницы, как логотип или навигация, которые повторяются на всем сайте.

0 голосов
/ 04 июня 2014

Я заметил, что никто не предложил использовать шаблонизатор .Я пришел сюда, потому что для проекта, с которым я работаю, движок шаблонов невозможен, и это может быть и вашей ситуацией, однако я подумал, что стоит упомянуть следующее: Twig (мой предпочтительный движок)) и Smarty позволяют передавать определенные переменные в включения.

Я очень рекомендую использовать механизм шаблонов всякий раз, когда это возможно, так как он упрощает ваш код переднего конца, добавляет слой абстракции между вашим передним и задним сторонами, а также Twig и Smartyавтоматически очищать передаваемые им переменные, что помогает смягчить атаки XSS.

Пример ветки

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'}
0 голосов
/ 30 ноября 2010

Если вы включаете файл, это все равно что вставить этот код в родительский файл. Вы можете просто сделать это:

<?php
$parameter = "Hello World";
include("header.php");
?>

, а затем в header.php

<?php
$parameter = isset($parameter) ? $parameter : "Default Text";
// Use accordingly
?>

Я использовал метод isset(), чтобы убедиться, что он уже имеет значение и создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...