54246


**$_SERVER['HOGE'];という変数がありました。**  
・$_SERVERには、予め決められた変数名しか格納されないと思っていたのですが、ここには任意の変数名を格納しても良いのですか？  
・PHP仕様としては問題ない？？


CC BY-SA 4.0
2019-04-17T02:21:01.833
54230
2019-04-17T06:14:50.023
7886
question
php
$_SERVERをグローバル変数として使用しても良い？


**_・`$_SERVER`には、予め決められた変数名しか格納されないと思っていたのですが、ここには任意の変数名を格納しても良いのですか？_**

「変数名」なのは、`$_SERVER`までで、`'HOGE'`の部分は配列要素を参照するための「キー」または「インデックス」ですね。伝わってはいるんだから、あまりこだわる必要はないかもしれませんが、微妙な部分で誤解を招く可能性があるので要注意だと思います。

「良いのですか？」については、いろんな見方があるかとおもいます。

## 現在のPHP言語処理系の実装で問題は出ないのか?

`$_SERVER`も通常の配列として実装されているようで、規定以外のキーの要素を付け加えても特に問題は無いようです。

## 現在のPHP言語仕様上それは問題ないことなのか?

「・PHP仕様としては問題ない？？」に詳しく書きました。

## プログラミングの実践上の問題としてそれはやっても良いことなのか?

**いいえ、やるべきではありません。**`$_SERVER`はWebサーバと連携して動くPHPがサーバ情報を保持するためのものです。宣言しなくても使えるお気楽保存場所として用意されているのではありません。

* * *

**_・PHP仕様としては問題ない？？_**

PHPマニュアルの[`$_SERVER`についてのページ]](https://www.php.net/manual/ja/reserved.variables.server.php)(「定義済みの変数」に分類されています)の記述はこんな感じです。

> ### 説明
>
> * * *
>
> `$_SERVER` は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列です。この配列のエントリは、Web サーバーにより
> 生成されます。全ての Web サーバーがこれら全てを提供する保障はありません。  
>  サーバーは、これらのいくつかを省略したり、この一覧にない他のものを 定義する可能性があります。これらの変数の多くは、[» CGI/1.1
> specification](http://www.faqs.org/rfcs/rfc3875)
> で定義されています。したがって、これらについては定義されていることを 期待することができます。

  * あくまでも「定義済み変数」である
  * 規定のインデックスかどうかに関わらず値の追加・変更をしてはいけないと言う記述はない
  * しかし、「Web サーバーにより 生成」された情報以外を保持することは想定していない

といったグレーゾーンと言うべきでしょうか。

実際問題として、PHP用のWebフレームワーク等では`$_SERVER`の中身を書き換えるようなものもあるようなので、PHPがこの辺を「Webサーバが設定した情報から書き換えちゃダメ」と言う、制限が厳しい方向へ仕様を変更する可能性は低そうです。(もし変更するなら、仕様変更を告知してから何年も経ってから、と言うことになるでしょう。)

* * *

私的にまとめると、 **出来るか出来ないかと聞かれれば出来るかもしれんけど、やって良いかどうかとは別問題** と言ったところでしょうか。

「とりあえずあり物を使って問題が出ないからそれでよしとする」と言うのと「多少面倒な部分があっても、目的別にちゃんとやり方を切り替える」と言うのとでは、特にアプリが大規模になってきた場合に色々と差が出てきます。絶対に他人に見せないような小規模の実験的コードを書いているのでない限りやめた方が良いですね。


CC BY-SA 4.0
2019-04-17T06:14:50.023
54246
2019-04-17T06:14:50.023
13972
54230
answer