web-dev-qa-db-ja.com

インクルードファイルに引数を渡す方法は?

全体を作成しようとしています<head>セクション独自のインクルードファイル。 1つの欠点は、タイトルと説明、キーワードが同じになることです。インクルードファイルに引数を渡す方法がわかりません。

コードは次のとおりです。

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>

明らかにこれは機能しません。インクルードファイルに引数を渡すにはどうすればよいですか?

38
menardmam

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に調整しました。

46
Michal M

インクルードには、呼び出し元の行のスコープがあります。

新しいグローバル変数を作成したくない場合は、include()を関数でラップできます。

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

_$title_は、includeHeader('My Fancy Title')のように、値を指定してincludeHeaderを呼び出すたびに、含まれるコードで定義されます。

複数の変数を渡す場合は、文字列ではなく常に配列を渡すことができます。

汎用関数を作成しましょう:

_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_が含まれるコードのスコープで定義されることがわかります。

94
Rolf

includeに引数を渡すことはできませんが、既に設定したすべての変数にアクセスできます。 include documentation から:

ファイルがインクルードされると、ファイルに含まれるコードは、インクルードが発生する行の変数スコープを継承します。呼び出し元ファイルのその行で使用可能な変数は、それ以降、呼び出されたファイル内で使用可能になります。

したがって:

index.php

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

header.php

<title> <?php echo $header; ?> </title>
12
Michael Mrozek

Marc、includeを使用している場合、使用する変数を設定するだけです。

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

ヘッダーファイルで:

<?php
  echo $var;
?>

以前に定義した変数が、どのインクルードでも使用できるようにします。

3
Richard Key

include()の前に変数を擬似引数/回避策として定義することは、多くの人が推奨しているように、悪い考えです。グローバルスコープに変数を導入します。代わりに、インクルードファイルで関数を定義して、渡す引数をキャッチします。

2
bcosca

あなたはそれを考えすぎています

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

::編集::

価値を追加することにしました

インクルードされたファイルは、インクルードした場所のスコープを取得します。したがって、関数内にファイルを含める場合:

<?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
DampeS8N

これは良いアプローチです。しかし、私は少し裏返しにします。レイアウト、Webページのラッパーを定義し、コンテンツファイルをそこに含めます。

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

これにより、ビジネスロジックとプレゼンテーションをうまく分離できます。また、サイト全体で繰り返されるロゴやナビゲーションなどのページの一部の繰り返しコードを削減するのに役立ちます。

1
Josef Sábl

ファイルを含めると、そのコードを親ファイルに挿入するようなものになります。これを簡単に行うことができます:

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

そして、_header.php_

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

isset()メソッドを使用して、既に値があり、インスタンス化されていることを確認しました。

0
Aaron Hathaway

テンプレートエンジンの使用を提案する人はいませんでした。私が取り組んでいるプロジェクトでは、テンプレートエンジンは使用できず、それもあなたの状況かもしれないので、私はここに来ましたが、これらに言及する価値があると思いました: Twig (私の好みengine)と Smarty の両方で、特定の変数をインクルードに渡すことができます。

I highlyフロントエンドコードを簡素化し、フロントエンドとバックエンドの間に抽象化層を追加し、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
DanielM