回答編集履歴

1

追加質問への回答

2022/03/28 09:26

投稿

arcxor
arcxor

スコア2857

test CHANGED
@@ -17,3 +17,75 @@
17
17
  ---
18
18
 
19
19
  本来はこういう方法を採らなくても済むように、`$_SERVER` 値などは直接参照せず、ユーティリティクラスメソッドなどを経由して取得するようにして、デバッグ環境での変数のオーバーライトなどが容易にできるように設計するほうが好ましいかもしれません。例えば `Util::$_SERVER` の値が設定されていればその値を、設定されていなければ `$_SERVER` を参照するといった具合です。
20
+
21
+ # 追記
22
+
23
+ > 今回の質問もhtml内に<?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?>のコードを書いています。
24
+ > 本来はこういう方法を採らなくても済むように〜の部分をもう少し掘り下げて教えていただけないでしょうか・・・
25
+
26
+ 今回のように多少ややこしいことをやりたい場合は、予めややこしいことができるような設計に基づいた実装をすべきだということです。
27
+
28
+ > ・.htaccessから間接的に上書きする方法はよろしくないのでしょうか?それに比べてユーティリティクラスを使うメリットはありますでしょうか?(速度など?)
29
+
30
+ 自動生成される `$_SERVER['DOCUMENT_ROOT']` の値を変更する(捻じ曲げる)というのはバグの温床にもなり本来は推奨されない方法です。
31
+
32
+ ただし、今回のように test 環境で設定値を変更したいような、一時的でその場しのぎをしたい場合であれば、`$_SERVER['DOCUMENT_ROOT']` の値を変更してしまう方法でもまあ良いのではないでしょうか。
33
+
34
+ > ・例えば Util::$_SERVER の値が設定されていればその値を〜のところをもう少し具体的に教えていただけないでしょうか。(.phpファイルを置いてrequire_onceとかで読み込み?
35
+
36
+ クラスやヘルパー関数のファイルやを用意する場合は、使う側で `require_once` などで読み込みます。実際のサイトのファイル構成などが分かりませんが、ページ数が大量にあってディレクトリ階層も異なるような場合は「Front Controller パターン」で実装することが多いと思います。動的な処理は Front Controller のファイルに任せて、ページごとに異なるHTMLソースコードは View として持っておくというものです。MVCパターンの簡易的な実装です。この説明が何を言っているのか意味がわからなければ MVC パターンについて調べてみてください。
37
+
38
+ ユーティリティクラスで云々というのも、ページ数が多い場合は Front Controller パターンでの実装を前提としたものになるため(そうでなければ、各ページファイルでそれぞれ Util を読み込む必要が出てしまう)、いきなり Util クラスでの実装例を説明してもしょうがない気がしますが、一応書いておきます。
39
+
40
+ ## before
41
+
42
+ ```php
43
+ <?php include($_SERVER['DOCUMENT_ROOT']."/include/header.html");?>
44
+
45
+ <?php include($_SERVER['DOCUMENT_ROOT']."/include/footer.html");?>
46
+ ```
47
+
48
+ ## after
49
+
50
+ ```php
51
+ class Util {
52
+ public static $_SERVER = [];
53
+
54
+ public static function getServerParam($key) {
55
+ return array_key_exists($key, self::$_SERVER) ? self::$_SERVER[$key] : $_SERVER[$key];
56
+ }
57
+
58
+ public static function includePartial($file) {
59
+ $includeFilePath = sprintf('%s/include/%s', self::getServerParam('DOCUMENT_ROOT'), $file);
60
+ include($includeFilePath);
61
+ }
62
+ }
63
+ ```
64
+
65
+ ```php
66
+ <?php require_once(__DIR__.'/Util.php'); // Util.php への正しいパスを書く ?>
67
+ <?php includePartial('header.html'); ?>
68
+
69
+ <?php includePartial('footer.html'); ?>
70
+ ```
71
+
72
+ ### test ディレクトリ以下の場合
73
+
74
+ ```php
75
+ class Util {
76
+ public static $_SERVER = [
77
+ 'DOCUMENT_ROOT' => 'ここに書き換え後のパスを書く',
78
+ ];
79
+
80
+ public static function getServerParam($key) {
81
+ return array_key_exists($key, self::$_SERVER) ? self::$_SERVER[$key] : $_SERVER[$key];
82
+ }
83
+
84
+ public static function includePartial($file) {
85
+ $includeFilePath = sprintf('%s/include/%s', self::getServerParam('DOCUMENT_ROOT'), $file);
86
+ include($includeFilePath);
87
+ }
88
+ }
89
+ ```
90
+
91
+ とするなり、`Util::getServerParam()` の実装を変えて `.htaccess` からのカスタムパラメータを受け付けるようにするなりすれば `php_value auto_prepend_file` を書くようなことをしなくても済むということです。