全体を作成しようとしています<head>
セクション独自のインクルードファイル。 1つの欠点は、タイトルと説明、キーワードが同じになることです。インクルードファイルに引数を渡す方法がわかりません。
コードは次のとおりです。
<?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()
を関数でラップできます。
_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
_が含まれるコードのスコープで定義されることがわかります。
include
に引数を渡すことはできませんが、既に設定したすべての変数にアクセスできます。 include
documentation から:
ファイルがインクルードされると、ファイルに含まれるコードは、インクルードが発生する行の変数スコープを継承します。呼び出し元ファイルのその行で使用可能な変数は、それ以降、呼び出されたファイル内で使用可能になります。
したがって:
<?php
$header = 'aaaaaaaaaaaaaaaaaaaaa';
include("header.php");
?>
<title> <?php echo $header; ?> </title>
Marc、includeを使用している場合、使用する変数を設定するだけです。
<?php
$var = "Testing";
include("header.php");
?>
ヘッダーファイルで:
<?php
echo $var;
?>
以前に定義した変数が、どのインクルードでも使用できるようにします。
include()
の前に変数を擬似引数/回避策として定義することは、多くの人が推奨しているように、悪い考えです。グローバルスコープに変数を導入します。代わりに、インクルードファイルで関数を定義して、渡す引数をキャッチします。
あなたはそれを考えすぎています
<?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"));
?>
これは良いアプローチです。しかし、私は少し裏返しにします。レイアウト、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';
これにより、ビジネスロジックとプレゼンテーションをうまく分離できます。また、サイト全体で繰り返されるロゴやナビゲーションなどのページの一部の繰り返しコードを削減するのに役立ちます。
ファイルを含めると、そのコードを親ファイルに挿入するようなものになります。これを簡単に行うことができます:
_<?php
$parameter = "Hello World";
include("header.php");
?>
_
そして、_header.php
_
_<?php
$parameter = isset($parameter) ? $parameter : "Default Text";
// Use accordingly
?>
_
isset()
メソッドを使用して、既に値があり、インスタンス化されていることを確認しました。
テンプレートエンジンの使用を提案する人はいませんでした。私が取り組んでいるプロジェクトでは、テンプレートエンジンは使用できず、それもあなたの状況かもしれないので、私はここに来ましたが、これらに言及する価値があると思いました: 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'}