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

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

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2819閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/08/18 16:36

編集2020/08/19 15:58

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

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

1<?php 2 3 initializeView(); 4 5 function initializeView() 6 { 7 // 指定パスのファイルとディレクトリのリストを取得 8 $dir = scandir( '/templates' ); 9 10 foreach ( $dir as $finfo ) 11 { 12 // HTML ファイル以外を除く 13 if ( strrchr( $finfo, '.' ) === '.html' ) { 14 // base.html, index.html を除く 15 if ( !preg_match( '/^base|^index/i', $finfo ) ) { 16 // 出力のバッファリングを有効にする 17 ob_start(); 18 // 対象 19 $arr_html[$finfo] = include_once '/templates/' . $finfo; 20 // バッファの内容を取得、バッファリングを無効にする 21 $arr_html[$finfo] = ob_get_clean(); 22 } 23 } 24 } 25 26 # ベース 27 include_once '/base.html'; 28 } 29 30?>

header.html

HTML

1<header> 2 <h1><?php echo $heading; ?></h1> 3</header>

main.html

HTML

1<main> 2 <?php 3 foreach ( $arr_request as $data ) { 4 echo '<p>' . $data['username'] . '</p>'; 5 } 6 ?> 7</main>

base.html

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3 <body> 4 <?php echo $arr_html['header.html']; ?> 5 <?php echo $arr_html['main.html']; ?> 6 </body> 7</html>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/08/18 20:29

突き詰めると結局は「既存のテンプレートエンジンが良い」になると思いますが。
退会済みユーザー

退会済みユーザー

2020/08/18 23:36 編集

大きなロジック群を把握しないままや、不要なロジック部もデプロイするのは、 特にセキュアな点が気になります。 最近のプログラマの傾向はテンプレートエンジンだけではなく、 ガンガン把握していないもの、不要なものを上げていますが、 プログラマの本来ではないと思っています。 また、テンプレートの基本を理解する上でも重要だと考えています。 ただ、この回答の質問は今回の論点ではありません。 ご回答有難う御座いました。
m.ts10806

2020/08/19 00:21

回答ではなく質問への追記修正依頼のコメント欄です。 「重い」というところだけで踏み切れるのか?とか、何のテンプレートエンジンをどのように利用してどこに重いと感じて、他の恩恵を捨ててまで自作を選んだのかが不明です。 「テンプレートの基本を理解」でしたら、自身が既存のテンプレートエンジンをどこまで研究したのか記載したほうが良いと思います。 私も自作したことがないわけではないですが、突き詰めると結局は既存のものに辿り着くことになります。 車輪の再開発をするのもエンジニアの本質ではないと思います。 要は、大目的が不明ということですね。 「把握してないもの不要なものを上げるのはプログラマの本来ではない」…を突き詰めるのであれば、極論、PHPならC言語の元のソースを読めないとPHPが使えないということも言えます。 私は現状の作りで悩むくらいなら既存のテンプレートエンジンを採用したほうが受けられる恩恵は大きいと思います。
退会済みユーザー

退会済みユーザー

2020/08/19 00:27

申し訳ありませんが、論点ではありません。
m.ts10806

2020/08/19 00:31

では「把握してないもの不要なものを上げるのはプログラマの本来ではない」というところも含めて仰る論点が正しく多くの人に伝わるように質問を修正してください。 ただ、いずれにしてもルールから見直さないと効率的な処理(もちろん高速化も含めて)にはならないので、そこはご認識ください。 理想と、現在やっていることは離れています。
退会済みユーザー

退会済みユーザー

2020/08/19 00:37

申し訳ありませんが、論点ではありません。
miyabi_takatsuk

2020/08/19 01:39

テンプレートエンジン自体の構文は、質問に記載のもので全てですか?
退会済みユーザー

退会済みユーザー

2020/08/19 02:20

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

退会済みユーザー

2020/08/19 15:57

miyabi_takatsuk さん、コメント頂き有難う御座います。 テンプレートエンジン自体の構文は掲載のもので全てです。 当初はループさせず、ただ一つ一つのテンプレートをバッファリングするフラットなものを書いてました。 ただ、それではテンプレート名や数が変わった時に汎用的ではないと判断して関数化していました。 現在、自作フレームワークを制作している中のテンプレート箇所になります。 m6u さん、コメント頂き有難う御座います。 また、Skinny の情報も有難う御座います。 たしかにスマートという言葉は、プログラムを知らないディレクターが、 制作を依頼する時に、プログラマに対し、そうやってくれと言いそうな言葉ですね。失礼しました。 具体的にですが、 私が正規式に対し、あかるければ、if 分は preg_match() 1 つで済んだものと思っています。 ただ、そうするのであれば、preg_match() は遅いとの情報により、他の関数を用いて、ディレクトリ内の base.html, index.html 以外のテンプレートを対象とする分岐が書ければと思いました。 基本的には、foreach 内の改修です。
maisumakun

2020/08/20 00:12

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

回答4

0

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

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

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

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

投稿2020/08/19 20:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/19 23:54 編集

長い間、フロントエンジニアを行なっているので、代表的なテンプレートエンジンは知っています。 初期の Smarty 辺りからでしょうか。 重いという言葉は、 1. キャッシュレベル 2. ソースレベル どちらかというと、2 です。 必要以上の仕様とソース、他人には学習コストを伴う等、、でしょうか。 リンク有難う御座いました。
maisumakun

2020/08/20 00:01

> 他人には学習コストを伴う 自作のテンプレートエンジンの仕様を知っている人は(いたとしても)ごく限られていますが、広く公開されているものであれば、すでにその技術を習得した人も存在しています。
退会済みユーザー

退会済みユーザー

2020/08/20 00:08

これから習得する若い人を応援しようかな。
退会済みユーザー

退会済みユーザー

2020/08/20 00:21

とても、Smarty を解析した後の質問とは思えないのですけれど^^;
退会済みユーザー

退会済みユーザー

2020/08/20 00:23

君レベルでしたか ?
退会済みユーザー

退会済みユーザー

2020/08/20 00:40

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

0

大きなロジック群を把握しないままや、不要なロジック部もデプロイするのは、

特にセキュアな点が気になります。

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

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

投稿2020/08/19 23:58

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/20 00:07

論点が違いますが、みんなが知っているから危ないというのもあります。 大手がセキュアに鈍感なのは、回答者のように人任せにしてしまい、既出のものは安全であろうと。 その代償として、大手企業は個人情報を盗られています。 どちらが良いというより、この辺りは選べないですよね。 指示によるってところでしょうか。 古い考え方だと思います。
maisumakun

2020/08/20 00:13

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

2020/08/20 00:40 編集

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

0

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

PHP は重いという情報や、

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

最近のプログラマの傾向はテンプレートエンジンだけではなく、

ガンガン把握していないもの、不要なものを上げていますが、
プログラマの本来ではないと思っています。

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

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

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

ちなみに

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

投稿2020/08/20 11:38

編集2020/08/20 11:41
kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2020/08/20 00:24

編集2020/08/20 00:29
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/20 00:33

これ、回答になっていないのですけれど。。。
maisumakun

2020/08/20 00:33

生兵法は大怪我のもと、と昔から言います。 質問内容から「本気で作る」という意識が見て取れなかったがゆえの回答も多いかと思います。
miyabi_takatsuk

2020/08/20 00:38

ぶっちゃけ言うと、 だったら質問とかしてないで、 自分の考えで、自分で調べてやればいいじゃん思いました。 > コスト重視世代で、今後の成長、活躍も望めない。 世代の問題ではありません。 時代の要請です。 その根本のシステムを作るのを目指すのなら、 質問者さん自身が目指せばいいでしょう。 しかし、質問者さんの発言は、自身は正義であり、 多種多様性を認めないような節があります。 つまり、人にもそれを強要するような押し付けがましさを強く感じます。 それでは、時代に取り残されると思いますよ。
m.ts10806

2020/08/20 01:11 編集

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

2020/08/20 01:30

> 既存のものありきでは、個々の頭の中は後進国のままでしょう。 既存のものについてはメリットを最大限に活かせるよう使い、無いなら無いで必要なものを自ら造れる方々ばかりだと思いますけどね。 > PC や PG を根本から知らない世代が多いようですね。 既に退会されているので分かりませんが、こちらの質問者様は根本から知っていると自負されている方だったのでしょうか。その一端でも挙げていただきたかったですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問