質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

PHP 自作テンプレートエンジンをコンパクトにしたい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 750
退会済みユーザー

退会済みユーザー

よくあるテンプレートエンジンは重いので自作しています。

preg_match() は、PHP は重いという情報や、
正規表現が難しく、strrchr() 、 preg_match() の 2 つでディレクトリ内の
ファイルを検索したり、他に良い関数は無いかと考えてはみましたが、
情報を探すことが出来ませんでした。
もっとスマートな方法でコンパクトにならないのか、というのが質問です。
良い書き方を教えて頂けると助かります。

その他に気になっているところです。
小さな質問です。メインではありません。わかる方がおりましたら、情報を頂ければと思います。

  1. PHP のバッファとは、PHP の仮想メモリーのような箇所に記録している ?
  2. コード中の ob 関連の関数 を正しく使用できているか ? 、タイミングは正しいか ?
  3. include_once 読み込みは 1 回で良いか ? 、 _once ではない方が良いか ?

宜しくお願い致します。

ディレクトリ構成

/templates/header.html
/templates/main.html
/templates/base.html
/templates/index.html // 使用しない、ダミーファイル。
/templates/data.php   // DB よりテンプレートのデータを配列にするファイル。
index.php

コード

index.php

<?php

  initializeView();

  function initializeView()
  {
      // 指定パスのファイルとディレクトリのリストを取得
      $dir = scandir( '/templates' );

      foreach ( $dir as $finfo )
      {
        //  HTML ファイル以外を除く
        if ( strrchr( $finfo, '.' ) === '.html' ) {
          // base.html, index.html を除く
          if ( !preg_match( '/^base|^index/i', $finfo ) ) {
            //  出力のバッファリングを有効にする
            ob_start();
            //  対象
            $arr_html[$finfo] = include_once '/templates/' . $finfo;
            //  バッファの内容を取得、バッファリングを無効にする
            $arr_html[$finfo] = ob_get_clean();
          }
        }
      }

    #  ベース
    include_once '/base.html';
  }

?>

header.html

<header>
  <h1><?php echo $heading; ?></h1>
</header>


main.html

<main>
  <?php
    foreach ( $arr_request as $data ) {
      echo '<p>' . $data['username'] . '</p>';
    }
  ?>
</main>

base.html

<!DOCTYPE html>
<html lang="ja">
  <body>
    <?php echo $arr_html['header.html']; ?>
    <?php echo $arr_html['main.html']; ?>
  </body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2020/08/19 11:20

    「もっとスマートな方法でコンパクトにならないのか」という評価点が、今ひとつ曖昧に思えます。どうあればスマートなのか、スマートさを実現するためにかえって回りくどいことをしないといけなくなりそうな場面はないか、第三者にもすぐ理解できる評価点が用意されていないと、前向きなアドバイスにつながらないのではないでしょうか。ちなみに、シンプルさでは、1ファイルで提供されている Skinny も一度チェックしてみることをおすすめします。 http://skinny.sx68.net/index.html

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/08/20 00:57

    miyabi_takatsuk さん、コメント頂き有難う御座います。
    テンプレートエンジン自体の構文は掲載のもので全てです。
    当初はループさせず、ただ一つ一つのテンプレートをバッファリングするフラットなものを書いてました。
    ただ、それではテンプレート名や数が変わった時に汎用的ではないと判断して関数化していました。
    現在、自作フレームワークを制作している中のテンプレート箇所になります。

    m6u さん、コメント頂き有難う御座います。
    また、Skinny の情報も有難う御座います。
    たしかにスマートという言葉は、プログラムを知らないディレクターが、
    制作を依頼する時に、プログラマに対し、そうやってくれと言いそうな言葉ですね。失礼しました。

    具体的にですが、
    私が正規式に対し、あかるければ、if 分は preg_match() 1 つで済んだものと思っています。
    ただ、そうするのであれば、preg_match() は遅いとの情報により、他の関数を用いて、ディレクトリ内の base.html, index.html 以外のテンプレートを対象とする分岐が書ければと思いました。
    基本的には、foreach 内の改修です。

    キャンセル

  • maisumakun

    2020/08/20 09:12

    では、論点を整理しましょう。

    jpenpalさんの目的としては、「自作テンプレートエンジンを活用するためなら、どんなデメリットでも克服してみせる」という意志があるのでしょうか、それとも「デメリットが解消できるなら、自作することにはこだわらない」のでしょうか。

    キャンセル

回答 4

+7

よくあるテンプレートエンジンは重いので自作しています。

そんなわけはないと思うけど。。。
まず、既存のテンプレートエンジンの解析をしてみては?

ほとんどの場合、キャッシュを作るはずなので、重くはならないです。
キャッシュを作るのが重いってことなら、論理処理はあきらめて、変数埋め込みレベルで我慢するしかないです。

参考:
簡易テンプレートエンジンを作る

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 09:21

    とても、Smarty を解析した後の質問とは思えないのですけれど^^;

    キャンセル

  • 2020/08/20 09:23

    君レベルでしたか ?

    キャンセル

  • 2020/08/20 09:40

    私レベルだったら、既存の類似コードの調査をした上で要件定義と設計ぐらいしますよ。

    キャンセル

+4

大きなロジック群を把握しないままや、不要なロジック部もデプロイするのは、
特にセキュアな点が気になります。

公開されて一定のユーザー数がついているライブラリであれば、セキュリティ面も含めて不具合が発見されれば報告、修正が行われていきますが、非公開で1人で作っているライブラリにはそのようなものは見込めません。

セキュリティに相応のリソースをつぎ込めるバックグラウンドがあるのなら話は別ですが、「自分で作ったほうがセキュアにできる」という考え方は、往々にして適切ではありません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 09:07

    論点が違いますが、みんなが知っているから危ないというのもあります。
    大手がセキュアに鈍感なのは、回答者のように人任せにしてしまい、既出のものは安全であろうと。
    その代償として、大手企業は個人情報を盗られています。

    どちらが良いというより、この辺りは選べないですよね。
    指示によるってところでしょうか。
    古い考え方だと思います。

    キャンセル

  • 2020/08/20 09:13

    自作エンジンは公開して使ってもらうのが前提ですか?内輪の用途で非公開のまま運用する形でしょうか?

    キャンセル

  • 2020/08/20 09:28 編集

    > 人任せにしてしまい、既出のものは安全であろうと。

    自作のものに対しても「セキュリティに相応のリソースをつぎ込めるバックグラウンド」を用意できるのならもちろん担保できますが、そうでない状況なら公開されているもののほうが「まだまし」という意味合いです。

    キャンセル

+1

嵐がとりあえずは過ぎ去ったようなので、、、

PHP は重いという情報や、

コンパイル言語に比べたら重い部類に入るとは思いますが、非コンパイル言語では中間くらいの立ち位置にあると思います。特に最近の高速化はもう、やばいです。(語彙力)

最近のプログラマの傾向はテンプレートエンジンだけではなく、
ガンガン把握していないもの、不要なものを上げていますが、
プログラマの本来ではないと思っています。

「プログラマの本来」というものを私も知りたいです。
なにを「上げて」いるかは分かりませんが、自分の場合は詳細の実装を知りたい場合はIDEの機能を使ってどのように実装されているか、どのような出力が行われているかを調べてます。ただ、私が知っている尊敬できる様々な人と、質問者さんが知っているそれらに詳しい人の積集合は決して大きくないと思うのであまり深掘りはしません。

もっとスマートな方法でコンパクトにならないのか、というのが質問です。

なにをもってスマートとおっしゃりたいのか分かりません。

ちなみに

個人的にオレオレフレームワークを作るのは楽しいですし、非常に勉強になると考えています。ただ、それを実際使うとなると、利点が限りなくゼロなのでGitHubに眠っていますが。。(北極圏に保存される前に削除しとこ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

-9

回答者らは世代的に、PC や PG を根本から知らない世代が多いようですね。

そういう世代が社会に出るようになってから、PC パフォーマンス任せの意識のみでソースを書く。
動けば良いのに意識くらいでした。

結果、 IT も下火になり、必要最低限のソースを作成も出来ず、セキュアの意識も薄く、コスト重視、
やがて IT 後進国として定着。

つまりは、コスト重視世代で、今後の成長、活躍も望めない。

逆に全く PC を知らない世代の方が、下手に知っている世代よりは有能に思えます。

世代間のこれまでの発表の場になっちゃいましたね。発想が貧困に思えました。
既存のものありきでは、個々の頭の中は後進国のままでしょう。

教えて goo 並みですね、 teratail も劣化しました。

クローズが最大の解決かな。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 09:38

    ぶっちゃけ言うと、
    だったら質問とかしてないで、
    自分の考えで、自分で調べてやればいいじゃん思いました。

    > コスト重視世代で、今後の成長、活躍も望めない。

    世代の問題ではありません。
    時代の要請です。
    その根本のシステムを作るのを目指すのなら、
    質問者さん自身が目指せばいいでしょう。
    しかし、質問者さんの発言は、自身は正義であり、
    多種多様性を認めないような節があります。
    つまり、人にもそれを強要するような押し付けがましさを強く感じます。

    それでは、時代に取り残されると思いますよ。

    キャンセル

  • 2020/08/20 10:10 編集

    全く話にならないと思って放置してたら寝言と大昔の理想論放り投げて逃亡ですか。
    現実がもっとも見えてないのが自分であるという認識がなければどんなプログラムもまともに動くものにはならないですよ。
    論点云々以前の問題。前提がおかしい。

    キャンセル

  • 2020/08/20 10:30

    > 既存のものありきでは、個々の頭の中は後進国のままでしょう。
    既存のものについてはメリットを最大限に活かせるよう使い、無いなら無いで必要なものを自ら造れる方々ばかりだと思いますけどね。

    > PC や PG を根本から知らない世代が多いようですね。
    既に退会されているので分かりませんが、こちらの質問者様は根本から知っていると自負されている方だったのでしょうか。その一端でも挙げていただきたかったですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る