Подтвердить что ты не робот

Как передать аргументы во включенный файл?

Я пытаюсь сделать весь раздел <head> своим собственным файлом include. Один из недостатков - название, описание и ключевое слово будут одинаковыми; Я не могу понять, как передать аргументы в include файл.

Итак, вот код:

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>

Очевидно, это не работает; как передать аргументы во включенный файл?

4b9b3361

Ответ 1

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.

Ответ 2

Поскольку никто, похоже, не упомянул об этом... Include имеет область действия, из которой она вызвана. Поэтому, если вы не хотите создавать новые глобальные переменные, вы можете вызвать include из функции. Пример:

function includeHeader($title) {
    include("inc/header.php");
}
Заголовок

$будет определен во включенном файле. Если вы хотите, чтобы из включенного файла было видно больше одной переменной, вы можете передать массив... пусть создать общую функцию

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

Voila!

Если вы хотите, чтобы включенный код мог изменять значения переданных переменных, вы можете пройти по ссылке (используя "&" ):

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

Теперь, если вы измените значение $title во включенном файле, это значение также изменится в "главном файле", вызывающем коде. Применяя это к массивам, вам, возможно, придется это сделать:

$variables['title'] = &$title;
$variable['someOtherVar'] = &$blah;

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

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

PS: Как насчет этого (используя extract):

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

Теперь все, что вам нужно сделать, это:

includeFileWithVariables("header.php",array('header'=>'aaaaa'));

Здесь мы просто передали одну переменную в массиве, но может быть больше.

Ответ 3

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

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

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

index.php

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

header.php

<title> <?php echo $header; ?> </title>

Ответ 4

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

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

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

<?php
  echo $var;
?>

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

Ответ 5

ты передумал это

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

:: EDIT::

Я решил добавить значение

Входящий файл получит объем, в который вы его включили. Поэтому, если вы включили в файл INSIDE функцию:

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

?>

Ответ 6

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

Ответ 7

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

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>

Затем у вас будет ваш основной script (index), который будет обрабатывать логику, подключается к базе данных и т.д.

index.php

$content = 'content.phtml';
$name = 'Marc'; //Can be pulled from database

include 'layout.phtml';

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

Ответ 8

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

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

а затем в header.php

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

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

Ответ 9

Я заметил, что никто не предложил использовать механизм шаблона. Я пришел посмотреть, потому что для проекта, с которым я работаю, механизм шаблонов невозможен, и это может быть и ваша ситуация, однако я подумал, что стоит упомянуть об этом: 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'}