HOME>WEBプログラム覚書>[PHP]require/includeの便利さがわかったら次はこれ。ウェブサイト制作に役立つ関数をつくる。

[PHP]require/includeの便利さがわかったら次はこれ。ウェブサイト制作に役立つ関数をつくる。

ウェブサイトの作成でPHPを使うメリットとしてウェブサイトのパーツをrequire()、include()で 呼び出すという方法がよく紹介されています。

たしかに便利ですが、呼び出したものがそのまま出力されてしまうため、汎用性欠けあまり使い勝手のいいものではありません。 require()、include()は純粋なPHPスクリプトを読み込むのに使って HTMLなコンテンツを呼び出すための専用の関数を作った方が捗ると思います。

HTMLコンテンツを呼び出すための関数をつくってみましょう。 ※CakePHPのElementなので知ってる人はこれ以降読んでも何一つ得るものはありません。

事例

特定のページにアクセスした場合、ナビゲーションをハイライト表示したい場合を考えてみます。 呼び出すファイルはこちら。ここに書くべきではないハイライト用の関数があるのでアレですが 単純なulのナビゲーションです。

nav.php

  1.  
  2. <?php
  3. $active = isset($active) ? $active : '';
  4.  
  5. /**
  6.  * この関数は本当はここに書くべき関数ではありません。
  7.  * HTML関連のクラスなどがあればそちらに記述しましょう。
  8.  */
  9. if (!function_exists('highlighter')) {
  10.     /**
  11.      * $pattern と $subject が同じ場合
  12.      * ハイライト用の文字列を返す
  13.      *
  14.      * @param mixed $pattern
  15.      * @param mixed $subject
  16.      * @return void | string
  17.      */
  18.     function highlighter($pattern, $subject) {
  19.         if ($pattern === $subject) {
  20.             return ' class="highlight"';
  21.         }
  22.     }
  23. }
  24. ?>
  25.  
  26. <ul>
  27.     <li<?php echo highlighter($active, 'php'); ?>>PHP</li>
  28.     <li<?php echo highlighter($active, 'js'); ?>>Javascript</li>
  29.     <li<?php echo highlighter($active, 'html5'); ?>>HTML5</li>
  30.     <li<?php echo highlighter($active, 'css3'); ?>>CSS3</li>
  31. </ul>
  32.  

nav.phpを呼び出すページのコードは下記のようになります。

nav.phpを呼び出すページのコード

  1. <?php
  2. // 全ページ共通のコード
  3. //
  4. // Elementクラスの読み込みとnav.phpがある
  5. // ディレクトリを指定してインスタンス化
  6. require_once '/path/to/Element.php';
  7. $element = new Element('/path/to/dir/');
  8.  
  9. // phpのページでの呼び出し
  10. echo $element->load('nav.php', array('active' => 'php'));
  11.  
  12. // javascriptのページでの呼び出し
  13. echo $element->load('nav.php', array('active' => 'js'));
  14.  
  15. // HTML5のページでの呼び出し
  16. echo $element->load('nav.php', array('active' => 'html5'));
  17.  
  18. // CSS3のページでの呼び出し
  19. echo $element->load('nav.php', array('active' => 'css3'));
  20. ?>

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

  1. <?php
  2. class Element
  3. {
  4.     /**
  5.      * エレメントファイルを格納するディレクトリのパス
  6.      *
  7.      * @var string
  8.      */
  9.     private $dir = '';
  10.  
  11.     /**
  12.      * コンストラクタ
  13.      *
  14.      * @param string $path_to_dir エレメントファイルを格納するディレクトリのパス
  15.      * @throws Exception
  16.      */
  17.     public function __construct($path_to_dir)
  18.     {
  19.         if (is_dir($path_to_dir)) {
  20.             $this->dir = $path_to_dir;
  21.         } else {
  22.             throw new Exception('ディレクトリが存在しません。');
  23.         }
  24.     }
  25.  
  26.     /**
  27.      * エレメントファイルをレンダリングした結果を返す
  28.      *
  29.      * @param string $filename エレメントファイル名
  30.      * @param array  $vars     エレメントで利用する変数をハッシュで設定
  31.      * @throws Exception
  32.      * @return string
  33.      */
  34.     public function load($filename, $vars = array())
  35.     {
  36.         if (count($vars) > 0) {
  37.             extract($vars);
  38.         }
  39.  
  40.         $path_to_file = $this->dir . $filename;
  41.  
  42.         if (file_exists($path_to_file) && is_readable($path_to_file)) {
  43.             ob_start();
  44.             require $path_to_file;
  45.             return ob_get_clean();
  46.         } else {
  47.             throw new Exception('エレメントファイルが見つかりません。');
  48.         }
  49.     }
  50. }
  51. ?>

ディレクトリトラバーサル対策はしていないので ユーザーの入力を直接利用するのはやめましょう。使うのであればあくまで自分用として利用してください。

WordPressでPHPに触れてもっと勉強したいと思ってるデザイナーさんはCakePHPというかフレームワークと呼ばれるものを学んでみるといいと思います。 アプリケーション開発するわけじゃないし・・・と思ってるかもしれませんが実はHTMLを書くのに便利な機能がたくさんあるので 非エンジニアの方でもきっと楽しいと思いますよ。

投稿日 2012年12月20日 19:27
カテゴリ PHP
タグ CakePHP | サンプルコード | フレームワーク | 関数
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1312

コメント

コメントする
Name
Email Address
URL