42412


phpにおける動的変数と静的変数の概念は、C言語についての[知恵袋の回答](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13117262228)の

> 値を格納する領域を動的変数では動的に確保し、静的変数では静的に確保する…のですが、これでは何のことかさっぱり判りませんね。
>
> 静的変数はプログラム実行開始時にメモリのどこかに変数の領域を確保し、そのプログラムが終了するまでその領域を使い続けます。
>
>
> 例えば、関数hogeの中で静的変数sを定義したとします。そして関数hogeを呼び出して、静的変数sに何かしらの値を代入し、そこからリターンしても静的変数sの領域は確保されたままです。
>
>
> このため、次に関数hogeを呼び出したときに静的変数sが保持している値は前回関数hogeからリターンしたときの静的変数sの値をそのまま保持しています。そしてプログラムが終了すると、静的変数sの領域は破棄されます。
>
>
> なお、この静的変数sの値を関数hoge以外からも参照できるというわけではありませんので、誤解なきよう（ポインターを使って間接的に参照するのであれば別ですが）。
>
>
> 動的変数は関数が呼び出されたときにメモリ上のどこかに領域が確保され、関数からリターンするとその領域は破棄されます。やはり関数hogeの中で動的変数dを定義したとします。この動的変数dの領域は関数hogeが呼び出されるまではメモリ上のどこにも存在しません。
>
>
> 関数hogeが呼び出されると動的変数dの領域が確保され、何かしらの値を代入できるようになります。そして関数hogeからリターンすると、この動的変数dの領域は破棄されます。
>
>
> このため、関数hogeが呼び出されるたびに動的変数dはメモリ上の違う領域（同じ領域である可能性もありますが、同じ領域が使われる保証はありません）が使用されます。
>
>
> 以上の事が関数の動作にどのように関わってくるかですが、関数が内部情報を保持せず、また同時に複数の場所から呼び出されないなら、静的変数でも動的変数でも同じです。
>
>
> しかし、関数が内部情報を保持するためには静的変数を使用しなければなりません。例えば、ある関数が何回呼び出されたかを数えて、１０回呼び出されるごとに特別な処理を行いたいとします。
>
> この場合、呼び出された回数は静的変数に保持しなければなりません。動的変数だと関数からリターンするたびに変数の値は破棄されてしまいますから。

と同じようなものなのでしょうか。


CC BY-SA 3.0
2018-03-13T02:46:48.453
42364
2018-03-15T09:02:26.057
2020-06-17T08:14:45.997
-1
27720
question
php
動的変数と静的変数の概念


おおむね、その知恵袋の回答で合っていると思います。

PHPだとグローバル変数とstatic変数が静的変数で、その他は動的変数になると思います。  
↑こちらコメントにご指摘により以下のように修正します。  
動的変数は静的変数とグローバル変数を除いたものではないでしょうか。

<http://php.net/manual/ja/language.variables.scope.php#language.variables.scope.static>


CC BY-SA 3.0
2018-03-14T00:48:23.680
42376
2018-03-14T01:40:08.703
2018-03-14T01:40:08.703
2232
2232
42364
answer


「静的変数 (static variables)」についての説明は、ご提示のものが C 言語でも PHP でも概ね正しいです。

ただし細かいことを言うと、「静的変数」という言葉には 2 つの意味があります。

  1. 静的な記憶域期間 (static storage duration) を持つ変数
  2. `static` 指定子がついた変数

前者の意味で「静的変数」と言うのであれば、グローバル変数は常に静的変数であり、C 言語でも PHP でもご提示の文章は正しいです。しかし PHP
の[このマニュアル](http://php.net/manual/ja/language.variables.scope.php#language.variables.scope.static)で使われている「静的変数」については

> 静的変数はローカル関数スコープのみに 存在します

と書かれているため、グローバル変数を含んでおらず、どちらかというと後者の使い方です。後者の意味の場合、ご提示の文章は部分的に正しくないです。ここでは英語版
Wikipedia の ["Static variable"
についての記事](https://en.wikipedia.org/wiki/Static_variable)が前者の意味で書かれていたので前者が一般的な用法であると判断しました。

* * *

「動的変数 (dynamic variables)」については議論が必要です。この単語は、少なくとも [PHP
のマニュアル](http://php.net/manual/en/) には載っていません。PHP は C 言語と違って
[GC](http://php.net/manual/ja/features.gc.php)
のある動的型付けプログラミング言語ですので、スタック及びヒープの使い方が C
言語と異なります（この点については、ブログ記事[「メモリとスタックとヒープとプログラミング言語」](http://keens.github.io/blog/2017/04/30/memoritosutakkutohi_puto/)が参考になります）。したがってどのような変数を「動的変数」と呼ぶべきなのか、私は知りません。

また C 言語においても、「動的変数」という言葉は曖昧だと **私は** 思います。類似概念である[「自動変数 (automatic
variables)」](https://en.wikipedia.org/wiki/Automatic_variable)には仕様レベルの定義があり、こちらの方がよく使われているように私は思います。ただし、周りの友人に聞いてみたところ「動的変数」を使っている方々もいらっしゃるようなので、この限りではありません。

**補足** : 今回の「動的変数」とは別に、Common Lisp には「動的変数 (dynamic variables)」ないし「スペシャル変数
(special variables)」という言葉が存在します。これは lexical scope / dynamic scope
を区別するための言い方です。詳しくは [M. Hiroi
さんの解説](http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp10.html)や、"Practical
Common Lisp" の[第 6 章](http://www.gigamonkeys.com/book/variables.html)が参考になります。


CC BY-SA 3.0
2018-03-15T08:56:55.870
42412
2018-03-15T08:56:55.870
19110
42364
answer