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

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

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

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 документации :

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

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

index.php

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

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