HOME>WEBプログラム覚書>[PHP]require/includeの便利さがわかったら次はこれ。ウェブサイト制作に役立つ関数をつくる。
[PHP]require/includeの便利さがわかったら次はこれ。ウェブサイト制作に役立つ関数をつくる。
ウェブサイトの作成でPHPを使うメリットとしてウェブサイトのパーツをrequire()、include()で
呼び出すという方法がよく紹介されています。
たしかに便利ですが、呼び出したものがそのまま出力されてしまうため、汎用性欠けあまり使い勝手のいいものではありません。
require()、include()は純粋なPHPスクリプトを読み込むのに使って
HTMLなコンテンツを呼び出すための専用の関数を作った方が捗ると思います。
HTMLコンテンツを呼び出すための関数をつくってみましょう。
※CakePHPのElementなので知ってる人はこれ以降読んでも何一つ得るものはありません。
事例
特定のページにアクセスした場合、ナビゲーションをハイライト表示したい場合を考えてみます。
呼び出すファイルはこちら。ここに書くべきではないハイライト用の関数があるのでアレですが
単純なulのナビゲーションです。
nav.php
<?php
$active = isset($active) ? $active : '';
/**
* この関数は本当はここに書くべき関数ではありません。
* HTML関連のクラスなどがあればそちらに記述しましょう。
*/
if (!function_exists('highlighter')) {
/**
* $pattern と $subject が同じ場合
* ハイライト用の文字列を返す
*
* @param mixed $pattern
* @param mixed $subject
* @return void | string
*/
function highlighter($pattern, $subject) {
if ($pattern === $subject) {
return ' class="highlight"';
}
}
}
?>
<ul>
<li<?php echo highlighter($active, 'php'); ?>>PHP</li>
<li<?php echo highlighter($active, 'js'); ?>>Javascript</li>
<li<?php echo highlighter($active, 'html5'); ?>>HTML5</li>
<li<?php echo highlighter($active, 'css3'); ?>>CSS3</li>
</ul>
nav.phpを呼び出すページのコードは下記のようになります。
nav.phpを呼び出すページのコード
<?php
// 全ページ共通のコード
//
// Elementクラスの読み込みとnav.phpがある
// ディレクトリを指定してインスタンス化
require_once '/path/to/Element.php';
$element = new Element('/path/to/dir/');
// phpのページでの呼び出し
echo $element->load('nav.php', array('active' => 'php'));
// javascriptのページでの呼び出し
echo $element->load('nav.php', array('active' => 'js'));
// HTML5のページでの呼び出し
echo $element->load('nav.php', array('active' => 'html5'));
// CSS3のページでの呼び出し
echo $element->load('nav.php', array('active' => 'css3'));
?>
class属性がhighlightのliにCSSを設定した場合の結果は、下記のようになります。
実行結果
- PHP
- Javascript
- HTML5
- CSS3
- PHP
- Javascript
- HTML5
- CSS3
- PHP
- Javascript
- HTML5
- CSS3
- PHP
- Javascript
- HTML5
- CSS3
requireとの違いは、呼び出し時に結果をコントロールできるという点です。
また、$activeを宣言して、require使えばいいじゃねーかと思いますがその場合、
$activeのスコープが広くなってしまうため上書きなどの危険性が高まります。
この方法であれば呼び出し元のファイルでは$activeは有効ではありません。
nav.php内で参照している$activeはElement::load()内でのみ有効な変数となります。
その他のメリットとしてはrequireを直接利用するより、
キャッシュだったり機能の追加もやりやすいのでおすすめです。
上記で利用したElementクラスは下記のようになります。
Elementクラス
Element.php
<?php
class Element
{
/**
* エレメントファイルを格納するディレクトリのパス
*
* @var string
*/
private $dir = '';
/**
* コンストラクタ
*
* @param string $path_to_dir エレメントファイルを格納するディレクトリのパス
* @throws Exception
*/
public function __construct($path_to_dir)
{
if (is_dir($path_to_dir)) {
$this->dir = $path_to_dir;
} else {
throw new Exception('ディレクトリが存在しません。');
}
}
/**
* エレメントファイルをレンダリングした結果を返す
*
* @param string $filename エレメントファイル名
* @param array $vars エレメントで利用する変数をハッシュで設定
* @throws Exception
* @return string
*/
public function load($filename, $vars = array())
{
if (count($vars) > 0) {
extract($vars);
}
$path_to_file = $this->dir . $filename;
if (file_exists($path_to_file) && is_readable($path_to_file)) {
ob_start();
require $path_to_file;
return ob_get_clean();
} else {
throw new Exception('エレメントファイルが見つかりません。');
}
}
}
?>
ディレクトリトラバーサル対策はしていないので
ユーザーの入力を直接利用するのはやめましょう。使うのであればあくまで自分用として利用してください。
WordPressでPHPに触れてもっと勉強したいと思ってるデザイナーさんはCakePHPというかフレームワークと呼ばれるものを学んでみるといいと思います。
アプリケーション開発するわけじゃないし・・・と思ってるかもしれませんが実はHTMLを書くのに便利な機能がたくさんあるので
非エンジニアの方でもきっと楽しいと思いますよ。
投稿日 |
2012年12月20日 19:27 |
カテゴリ |
PHP |
タグ |
CakePHP | サンプルコード | フレームワーク | 関数 |
トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1312 |
コメント