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

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

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

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

Q&A

解決済

2回答

755閲覧

静的寿命を持つローカル変数staticについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2017/11/14 02:39

<?php $a = 0; for($i=0;$i<5;$i++){ func(); } function func(){ global $a; $b = 0; static $c = 0; print "変数$aは{$a}、変数$bは{$b}、変数$cは{$c}です<br>"; $a++; $b++; $c++; } ?>

<実行結果>
変数0、変数0、変数0です
変数1、変数0、変数1です
変数2、変数0、変数2です
変数3、変数0、変数3です
変数4、変数0、変数4です

となります。$a,$bはわかるのですが$cはなぜこうなるのでしょうか?
staticをつけるとグローバル変数と同じ記憶寿命を持ち関数が終了しても記憶寿命が持つというのはわかるのですが、毎回$c =0;がある以上毎回、変数$cは{$c}の結果は0になってしまう気がするのですがなぜそうならないのでしょうか?

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

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

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

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

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

guest

回答2

0

静的変数の初期化は、最初の1回だけにしないと、結局のところ普通のローカル変数とおなじになってしまいます。なので、そのように仕様が決められています。

以下に説明があります。

PHP: 変数のスコープ - Manual

この関数は、コールされる度に$aを 0にセットし、0 を出力するのでほとんど役にたちません。変数を1増やす $a++ は、関数から外に出ると変数 $aが消えてしまうために目的を達成しません。現在 のカウントの追跡ができるようにカウント関数を使用できるようにするためには、変数$aをstaticとして宣言します。

例5 静的変数の使用例

<?php function test() { static $a = 0; echo $a; $a++; } ?>

こうすると、$a は関数が最初にコールされたときにのみ初期化され、 test() 関数がコールされるたびに $a の値を出力してその値を増加させます。

投稿2017/11/14 02:53

ockeghem

総合スコア11701

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

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

退会済みユーザー

退会済みユーザー

2017/11/14 02:54

ご回答ありがとうございます。 助かりました。
guest

0

ベストアンサー

マニュアル変数のスコープ ¶を参照ください

staticは関数が最初にコールされたときにのみ初期化しその後その変数は保持されます

投稿2017/11/14 02:49

yambejp

総合スコア114505

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

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

退会済みユーザー

退会済みユーザー

2017/11/14 02:53

そのような仕様だったのですね。ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問