PHPについて質問です。


スクリプトを書くとき、globalではなく、staticを使った方がよいそうですが、
staticというのいまひとつ理解しきれません。
globalを使ったごく簡単なスクリプトをを作成して、
それと同じ動きをするスクリプトをstaticを使って書き直す
という例を用いてstaticについて解説してください。

回答の条件
  • 1人2回まで
  • 登録:2008/10/29 18:46:10
  • 終了:2008/10/30 01:35:09

ベストアンサー

id:krese No.1

krese回答回数20ベストアンサー獲得回数42008/10/29 21:21:10

ポイント60pt
$i = 0;
echo counter();
echo counter();
echo counter();
echo $i;

function counter() {
	global $i;
	return ++$i;
}
$i = 0;
echo counter();
echo counter();
echo counter();
echo $i;

function counter() {
	static $i;
	return ++$i;
}

上の例がglobal、下の例がstaticです。

globalの場合、グローバル変数$iが関数によって変更されているのがわかると思います。

こういったケースは変数の汚染と呼ばれます。


膨大なプログラムになると、他の部分でどういった名前の変数が使われているか把握しきれないため、

(特に汎用的な名前の)グローバル変数を使うのは避け、

staticで補える部分はstaticにするべきだという考えが支持されています。

id:taroemon

ご回答ありがとうございます。


僕がどこかで見た「globalではなく、staticを使った方がよい」というのは

処理速度の問題だったと思うのですが、セキュリティにも関係があるのですね。

staticについてより理解が深まったような気がしました。


ところで「globalではなく、staticを使った方がよい」というのを文面通りとらえると、

globalで書いたスクリプトはstaticで書き直せる、

たとえば、上記のスクリプトを同じ結果で出るように

staticで書き表せることができるのでしょうか?

それをどうやってやるかというの質問の趣旨です。


・・・とここまで書いてひょっとしたら私の解釈違いだったのかなと思えてきました。

念のため、さらに回答をお待ちします。

2008/10/29 23:56:17
  • id:krese
    class Counter {
    static $i = 0;
    function increment() {
    return ++self::$i;
    }
    function getValue() {
    return self::$i;
    }
    }

    $i = new Counter;
    echo $i->increment();
    echo $i->increment();
    echo $i->increment();
    echo $i->getValue();

    "同じ出力「1233」を得たい"かつ"グローバル変数が汚染されない"を考えると、
    上記のようなコードになると思います。
    http://jp.php.net/manual/ja/language.variables.scope.php
    こちらもあわせてご覧ください。

    ただ誤解しないで頂きたいのは全てのケースにおいて「globalではなく、staticを使った方がよい」というわけではない、ということです。
    それなら「global」という機構が存在する意味がありませんので・・・。
    たとえば小さいプログラムにおいて、設定ファイルを読み込んだ値をグローバル変数にして使いまわすですとか、
    そういった使い方は有用なのです。staticやクラスにすると余計に煩雑になってしまいます。

    「globalではなく、staticを使った方がよい」というのは、趣旨としては
    「globalを乱発するのではなく、staticの方が適していないかを考えよう」という意味だと思います。
    staticの部分はすべてglobalで代替出来てしまうので、安易にglobalを使う人がたまに見られます。
    これでは規模が大きくなったときに困りますので、staticを使うべきところはstaticを使いましょう、という話です。

    以上の回答でいかがでしょうか。まだまだ疑問点ありましたらお伝えください。
  • id:taroemon
    詳しいコメントありがとうございます。
    やっぱり勘違いだったとのかなと思ったので、他の回答を待たずに締め切ってしまいました。

    >「globalを乱発するのではなく、staticの方が適していないかを考えよう」という意味だと思います。
    >staticの部分はすべてglobalで代替出来てしまうので、安易にglobalを使う人がたまに見られます。
    >これでは規模が大きくなったときに困りますので、staticを使うべきところはstaticを使いましょう、という話です。
    とりわけ知りたかったのはこの部分です。
    結局勘違いだったと言うことなのですが、それがわかってとてもすっきりしました。

    また質問しますので今後ともいろいろ教えてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません