Я пытаюсь сделать весь раздел <head>
своим собственным файлом include. Один из недостатков – название, описание и ключевое слово будут одинаковыми; Я не могу понять, как передать аргументы в файл include.
Итак, вот код:
<?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>
Очевидно, что это не работает; как передать аргументы во включенный файл?
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.
Поскольку никто, кажется, не упомянул об этом … Include имеет область действия, из которой она вызвана. Поэтому, если вы не хотите создавать новые глобальные переменные, вы можете вызвать include из функции. Пример:
function includeHeader($title) { include("inc/header.php"); }
вfunction includeHeader($title) { include("inc/header.php"); }
$ title будет определен во включенном файле. Если вы хотите, чтобы из включенного файла было видно больше одной переменной, вы можете передать массив … давайте создадим общую функцию
function includeFile($file, $variables) { include($file); }
Вуаля!
Если вы хотите, чтобы включенный код мог изменять значения переданных переменных, вы можете пройти по ссылке (используя «&»):
function includeHeader(&$title) { include("inc/header.php"); }
вfunction includeHeader(&$title) { include("inc/header.php"); }
Теперь, если вы измените значение $ title во включенном файле, это значение также изменится в «главном файле», вызывающем коде. Применяя это к массивам, вам, возможно, придется это сделать:
$variables['title'] = &$title; $variable['someOtherVar'] = &$blah; function includeFile($file, &$variables) { include($file); }
Но меня увлекают, и я даже не уверен, что это работает. Я думаю, что это должно произойти, но у меня плохой опыт использования пропусков по ссылкам внутри массивов на PHP, и я думаю, что лучше избегать этого.
PS: Как насчет этого (используя экстракт ):
function includeFileWithVariables($fileName, $variablesArray) { extract($variablesArray); include($fileName); }
Теперь все, что вам нужно сделать, это:
includeFileWithVariables("header.php",array('header'=>'aaaaa'));
Здесь мы просто передали одну переменную в массиве, но может быть и больше.
Вы не можете передавать аргументы для include
, но он имеет доступ ко всем уже установленным вами переменным. Из include
документации :
Когда файл включен, код, который он содержит, наследует область изменения строки, в которой происходит включение. Любые переменные, доступные в этой строке в вызывающем файле, будут доступны в вызываемом файле с этой точки вперед.
Таким образом:
<?php $header = 'aaaaaaaaaaaaaaaaaaaaa'; include("header.php"); ?>
в<?php $header = 'aaaaaaaaaaaaaaaaaaaaa'; include("header.php"); ?>
<title> <?php echo $header; ?> </title>
Ну марка, когда вы используете include, вы можете просто настроить переменную, которую нужно использовать:
<?php $var = "Testing"; include("header.php"); ?>
в<?php $var = "Testing"; include("header.php"); ?>
В файле заголовка:
<?php echo $var; ?>
Разрешить использование определенных ранее переменных можно использовать в любом из них.
вы уже думали об этом
<?php $header = "aaaaaaaaaaaaaaaaa"; include("header.php"); ?>
в<?php $header = "aaaaaaaaaaaaaaaaa"; include("header.php"); ?>
::РЕДАКТИРОВАТЬ::
Решил, я бы добавил значение
Входящий файл получит объем, в который вы его включили. Поэтому, если вы включили в файл INSIDE функцию:
<?php $get_me = "yes"; function haha() { include("file.php"); } haha(); // And file.php looks like echo $get_me; // notice + blank ?>
в<?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 $output = "this"; include("cool_box.php"); $output = "will"; include("cool_box.php"); $output = "work"; include("cool_box.php"); ?>
в<?php $output = "this"; include("cool_box.php"); $output = "will"; include("cool_box.php"); $output = "work"; include("cool_box.php"); ?>
в<?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")); ?>
определяя переменную как псевдо-аргумент / обходной путь до того, как include()
– как рекомендовано многими, – плохая идея. он вводит переменную в глобальном масштабе. определите функцию во включенном файле вместо этого, чтобы поймать аргументы u, которые хотите передать.
Это хороший подход. Я бы сделал это немного наизнанку. Определите макет, обертку для вашей веб-страницы и включите в нее свой файл содержимого:
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';
Таким образом, вы можете прекрасно отделить бизнес-логику и презентацию. И это может помочь вам сократить повторяющийся код для частей страницы, таких как логотип или навигация, которые повторяются на всем сайте.
Если вы включаете файл, это как вставка этого кода в родительский файл. Вы могли бы просто сделать это:
<?php $parameter = "Hello World"; include("header.php"); ?>
в<?php $parameter = "Hello World"; include("header.php"); ?>
а затем в header.php
<?php $parameter = isset($parameter) ? $parameter : "Default Text"; // Use accordingly ?>
Я использовал метод isset()
чтобы убедиться, что он уже имеет значение и создается экземпляр.
Я заметил, что никто не предложил использовать движок шаблонов . Я пришел посмотреть здесь, потому что для проекта, с которым я работаю, механизм шаблонов невозможен, и это может быть и ваша ситуация, однако я подумал, что стоит упомянуть об этом: 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'}