記事一覧

PHPのstaticとJavaのstaticを比較してみた




目次



static宣言

ハロー、みなさん。エジソンです。

唐突に心はstatic、人生はdynamicに!というワードが浮かび上がりました。プログラムとは人生哲学に通じるものなのかもしれません。

さて本題です。

staticを使うことで、クラスをnewしてインスタンスを生成することなく、クラスに備わっているstaticフィールドの参照やstaticメソッドの実行が可能です。このように、static修飾を付与した場合というのは、PHPをはじめとしてJavaやC#などの各種言語でも同様のふるまいになります。

しかし、実際にはPHPをWebで利用する場合(むしろPHPはWebで利用することがほとんどですが)には、JavaとPHPでstaticのスコープに違いがあることを覚えておかなくてはなりません。

Javaのstaticについて

Javaのstaticは前述したように、クラスをnewしてインスタンスを生成することなく、クラスに備わっているstaticフィールドの参照、staticメソッドの実行が可能なものです。

言わば、プログラムが実行している間は、staticで宣言された部分というのは、メモリに保持され続けるわけです。

JavaをWebサーバで動作させる場合の話になりますが、例えばTomcatのようなWebサーバ上でJavaのプロセスを動作させることになります。Webサーバ一台につき、Javaのプロセスは一つという構成になります。

すると、WebサーバにアクセスするユーザAとユーザBの間でstaticな情報は共有されることになります。



Javaの場合は、このようなstaticの特性を利用して、取得に時間が掛かるデータをキャッシュする用途でstaticを利用できます。

PHPのstaticについて

一方で、PHPをWebサーバで動作させた場合の動作はJavaとは異なるものになります。

例えばWebサーバにApacheを選択してPHPをモジュール版で組み込み、且つWindowsで動作させる場合には、デフォルトで、Javaと同じようにPHPのプロセスは一つだけになります。

ApacheでPHPをどのように動作させるかのモードを、MPMと言います。

Apache MPM
Windowsのデフォルト Apache MPM winnt について
このマルチプロセッシングモジュール (MPM) は Windows NT でのデフォルトになります。 一つの制御用プロセスを用い、これが一つの子プロセスを起動し、 そして子プロセスがリクエストを取り扱うためにスレッドを 起動します。

すると、WebサーバにアクセスするユーザAとユーザBの間でstaticな情報は共有されることになるのかというと、そう言う訳ではありません。PHPではリクエストが開始されるタイミングで、staticで定義されたデータ領域は全て破棄され、初期状態に戻ってしまいます。



PHPのこの動作は、MPMがどのような種類であっても同様になります。

そのため、PHPではユーザAとユーザBの間でstaticな情報を共有することはできません。これが、PHPとJavaで大きく違うことです。

まとめ

PHPをWebで利用する場合のstaticデータは、名前空間付きのグローバルデータとして心得るべし。

一つの例として、PHPのフレームワークであるFuelPHPでは、再利用されるデータオブジェクト(例えば、DBコネクションなど)をstaticとして宣言して、フレームワーク利用者が簡単に扱えるようにしています。

FuelPHP - Database 使い方

PHPをWebで利用する場合には、staticデータをキャッシュとして活用することができないので、ファイル保存をするなど別の代替手段を講じる必要があるでしょう。

JavaプログラマがPHPを利用する場合には、staticデータの扱われ方を正しく理解しましょう、というお話でした。


関連記事

このエントリーをはてなブックマークに追加

コメント

コメントの投稿

非公開コメント

プロフィール

EZOLABブログへようこそ。
EZOLABは、札幌のソフトウェア会社です。

http://ezolab.co.jp