<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.variables.scope.php',
    1 => '変数のスコープ',
    2 => '変数のスコープ',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => '変数',
  ),
  'prev' => 
  array (
    0 => 'language.variables.predefined.php',
    1 => '定義済みの変数',
  ),
  'next' => 
  array (
    0 => 'language.variables.variable.php',
    1 => '可変変数',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.scope" class="sect1">
   <h2 class="title">変数のスコープ</h2>
   
   <p class="simpara">
    変数のスコープは、その変数が定義されたコンテキストです。
    PHP には関数スコープとグローバルスコープがあります。
    関数の外部で定義されたあらゆる変数は、グローバルスコープになります。
    ファイルが include された場合、
    そのファイルに含まれるコードは、
    include が行われた行の変数のスコープを引き継ぎます。
   </p>
   <div class="example" id="example-1">
    <p><strong>例1 グローバル変数のスコープの例</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br />include </span><span style="color: #DD0000">'b.inc'</span><span style="color: #007700">; </span><span style="color: #FF8000">// 変数 $a は b.inc で利用できます。<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="simpara">
    名前付きの関数や
    <a href="functions.anonymous.php" class="link">無名関数</a>
    の内部で作られた変数は、関数の内部のスコープでのみ使えます。
    しかし、<a href="functions.arrow.php" class="link">アロー関数</a>
    は親のスコープの変数を内部で利用できるようにするために、
    変数をバインドします。
    ファイルの include が呼び出し側のファイルで発生した場合、
    呼び出されたファイルに含まれる変数は、
    関数を呼び出す内部で定義されたかのように利用できます。
   </p>    
   <div class="example" id="example-2">
    <p><strong>例2 ローカル変数のスコープ</strong></p>
    <div class="example-contents"> 
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// グローバルスコープ<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{ <br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">; </span><span style="color: #FF8000">// $a は、ローカルスコープの $a を参照しているので未定義です<br /></span><span style="color: #007700">} <br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="simpara">
    このスクリプトは、未定義の変数があるという <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>
    (PHP 8.0.0 より前のバージョンでは <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>)
    を生成します。
    これは、echo 命令がローカル版の
    <var class="varname">$a</var> 変数を参照しているにもかかわらず、こ
    のスコープでは値が代入されていないからです。この動作は、特にローカ
    ルな定義で上書きしない限りグローバル変数が自動的に関数で使用可能で
    ある C 言語と少々異なっていると気がつかれるかもしれません。C言語の
    ような場合、グローバル変数を不注意で変更してしまうという問題を生じ
    る可能性があります。PHP では、グローバル変数は、関数の内部で使用す
    る場合、関数の内部でグローバルとして宣言する必要があります。
   </p>

   <div class="sect2" id="language.variables.scope.global">
    <h3 class="title"><code class="literal">global</code> キーワード</h3>
    <p class="simpara">
     <code class="literal">global</code> キーワードは
     グローバルスコープの変数をローカルスコープにバインドするために使います。
     このキーワードは変数のリストや、単一の変数を指定できます。
     グローバル変数と同じ名前の変数を参照するローカル変数が作られます。
     グローバル変数が存在しない場合、グローバルスコープの変数が作られ、
     <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> が代入されます。
    </p>
    <p class="para">
     <div class="example" id="example-3">
      <p><strong>例3 <code class="literal">global</code> の使用</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">Sum</span><span style="color: #007700">() <br />{<br />    global </span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br />} <br /><br /></span><span style="color: #0000BB">Sum</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
3
</pre></div>
      </div>
     </div>
    </p>
    
    <p class="simpara">
     関数の内部で
     <var class="varname">$a</var>、<var class="varname">$b</var>
     をグローバル宣言を行うことにより、両変数への参照は、グローバル変数
     の方を参照することになります。ある関数により操作できるグローバル変
     数の数は無制限です。
    </p>

    <p class="simpara">
     グローバルスコープから変数をアクセスする2番目の方法は、PHPが定義す
     る配列<var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>を使用することです。先の例は、次
     のように書き換えることができます。
    </p>
    <p class="para">
     <div class="example" id="example-4">
      <p><strong>例4 globalのかわりに<var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>を使用する</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">Sum</span><span style="color: #007700">() <br />{<br />    </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">] = </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'a'</span><span style="color: #007700">] + </span><span style="color: #0000BB">$GLOBALS</span><span style="color: #007700">[</span><span style="color: #DD0000">'b'</span><span style="color: #007700">];<br />} <br /><br /></span><span style="color: #0000BB">Sum</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$b</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>

    <p class="simpara">
     配列<var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>は連想配列であり、グローバル変数の
     名前がキー、その変数の内容が配列要素の値となっています。
     <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> は <a href="language.variables.superglobals.php" class="link">スーパーグローバル</a>
     であるため、<var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>は全てのスコープに存在します。
     以下にスーパーグローバルの効果を示す例を示します。
    </p>
    <p class="para">
     <div class="example" id="example-5">
      <p><strong>例5 スーパーグローバルとスコープの例</strong></p>
      <div class="example-contents">   
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test_superglobal</span><span style="color: #007700">()<br />{<br />    echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>
   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     <code class="literal">global</code> キーワードを関数の外部で使ってもエラーにはなりません。
     そのファイルが関数の内部からインクルードされたときに使うことができます。
    </span>
   </p></blockquote>
   </div>

   <div class="sect2" id="language.variables.scope.static">
    <h3 class="title">static 変数の使用</h3>   
    <p class="simpara">
     変数のスコープに関する別の重要な機能は、<em>static (静的)</em> 
     変数です。static 変数はローカル関数スコープのみに
     存在しますが、プログラム実行がこのスコープの外で行われるようになっ
     てもその値を失いません。次の例を見てください。
    </p>
    <p class="para">
     <div class="example" id="example-6">
      <p><strong>例6 static 変数が必要な場面の例</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>
    <p class="simpara">
     この関数は、コールされる度に<var class="varname">$a</var>を
     <code class="literal">0</code>にセットし、<code class="literal">0</code> を出力するのでほとん
     ど役にたちません。変数を1増やす $a++ は、関数から外に出ると変数
     <var class="varname">$a</var>が消えてしまうために目的を達成しません。現在
     のカウントの追跡ができるようにカウント関数を使用できるようにするた
     めには、変数<var class="varname">$a</var>を static として宣言します。
    </p>
    <p class="para">
     <div class="example" id="example-7">
      <p><strong>例7 static 変数の使用例</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>

    <p class="simpara">
     こうすると、<var class="varname">$a</var> は関数が最初にコールされたときにのみ初期化され、
     <code class="literal">test()</code> 関数がコールされるたびに <var class="varname">$a</var>
     の値を出力してその値を増加させます。
    </p>

    <p class="simpara">
     static 変数は、再帰関数を実現する1つの手段としても使用されます。
     次の簡単な関数は、中止す
     るタイミングを知るためにstatic変数<var class="varname">$count</var>を用いて、
     10 回まで再帰を行います。
    </p>
    <p class="para">
     <div class="example" id="example-8">
      <p><strong>例8 再帰関数でのstatic変数の使用</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$count</span><span style="color: #007700">++;<br />    echo </span><span style="color: #0000BB">$count</span><span style="color: #007700">;<br />    if (</span><span style="color: #0000BB">$count </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">10</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />    }<br />    </span><span style="color: #0000BB">$count</span><span style="color: #007700">--;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>

   <p class="para">
    PHP 8.3.0 より前のバージョンでは、
    static 変数には、定数式でのみ初期化できていました。
    PHP 8.3.0 以降では、動的な式(例: 関数呼び出し) での初期化も許可されています。
   </p>
   <p class="para">
    <div class="example" id="example-9">
     <p><strong>例9 static 変数の宣言</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(){<br />    static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;          </span><span style="color: #FF8000">// 正しい<br />    </span><span style="color: #007700">static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">+</span><span style="color: #0000BB">2</span><span style="color: #007700">;        </span><span style="color: #FF8000">// 正しい<br />    </span><span style="color: #007700">static </span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">sqrt</span><span style="color: #007700">(</span><span style="color: #0000BB">121</span><span style="color: #007700">);  </span><span style="color: #FF8000">// PHP 8.3.0 以降は正しい<br /><br />    </span><span style="color: #0000BB">$int</span><span style="color: #007700">++;<br />    echo </span><span style="color: #0000BB">$int</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>

   <p class="simpara">
    無名関数の内部にある static 変数は、
    その特定の関数のインスタンス内でのみ生き残ります。
    コールされるたびに無名関数が再作成される場合、
    static 変数は再初期化されます。
   </p>
   <div class="example" id="example-10">
    <p><strong>例10 無名関数の内部にある static 変数</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= (static function () use (</span><span style="color: #0000BB">$input</span><span style="color: #007700">) {<br />        static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$counter</span><span style="color: #007700">++;<br />        return </span><span style="color: #DD0000">"Input: </span><span style="color: #0000BB">$input</span><span style="color: #DD0000">, Counter: </span><span style="color: #0000BB">$counter</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />    });<br /><br />    return </span><span style="color: #0000BB">$result</span><span style="color: #007700">();<br />}<br /><br /></span><span style="color: #FF8000">// Calls to exampleFunction will recreate the anonymous function, so the static<br />// variable does not retain its value.<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #DD0000">'A'</span><span style="color: #007700">); </span><span style="color: #FF8000">// Outputs: Input: A, Counter: 1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">exampleFunction</span><span style="color: #007700">(</span><span style="color: #DD0000">'B'</span><span style="color: #007700">); </span><span style="color: #FF8000">// Outputs: Input: B, Counter: 1<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    (オーバーライドされていない場合)
    内部でstatic 変数を使ったメソッドも継承されます。
    PHP 8.1.0 以降は、継承されたメソッドは、
    親クラスのメソッドとstatic 変数を共有するようになりました。
    つまり、メソッド内でのstatic 変数も、
    static プロパティと同じ振る舞いになったということです。
   </p>

   <p class="simpara">
    PHP 8.3.0 以降では、static 変数は任意の式で初期化できるようになりました。
    これはたとえば、メソッドをコールすることでも、
    static 変数を初期化できるようになったということです。
   </p>

   <div class="example" id="example-11">
    <p><strong>例11 継承されたメソッドのstatic 変数を使う</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">counter</span><span style="color: #007700">() {<br />        static </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$counter</span><span style="color: #007700">++;<br />        return </span><span style="color: #0000BB">$counter</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">Bar </span><span style="color: #007700">extends </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(2)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Bar</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(3), PHP 8.1.0 より前のバージョンでは int(1)<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Bar</span><span style="color: #007700">::</span><span style="color: #0000BB">counter</span><span style="color: #007700">()); </span><span style="color: #FF8000">// int(4), PHP 8.1.0 より前のバージョンでは int(2)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   </div>
   
   <div class="sect2" id="language.variables.scope.references">
    <h3 class="title">グローバル変数とstatic 変数のリファレンス</h3>
    <p class="simpara">
    PHP は、
    <a href="language.references.php" class="link">リファレンス</a>
    変数の修正子として
    <a href="language.variables.scope.php#language.variables.scope.static" class="link">static</a> および
    <a href="language.variables.scope.php#language.variables.scope.global" class="link">global</a>
    を実装しています。
     例えば、関数スコープ内に<code class="literal">global</code>
     命令により実際にインポートされた真のグローバル変数は、
     実際にグローバル変数へのリファレンスを作成します。
     これにより、以下の例が示すように予測できない動作を引き起こす可能性
     があります。
    </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test_global_ref</span><span style="color: #007700">() {<br />    global </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">test_global_noref</span><span style="color: #007700">() {<br />    global </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">test_global_ref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">test_global_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

   <p class="para">上の例の出力は以下となります。</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
NULL
object(stdClass)#1 (0) {
}
</pre></div>
   </div>

   <p class="simpara">
    類似の動作が<code class="literal">static</code>命令にも適用されます。
    リファレンスはstaitc 変数に保存することができません。
   </p>
   
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function &amp;</span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">() {<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Static object: '</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />        </span><span style="color: #FF8000">// Assign a reference to the static variable<br />        </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">++;<br />    }<br />    return </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />}<br /><br />function &amp;</span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">() {<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Static object: '</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">);<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;<br />        </span><span style="color: #FF8000">// Assign the object to the static variable<br />        </span><span style="color: #0000BB">$obj </span><span style="color: #007700">= </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />    if (!isset(</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">property</span><span style="color: #007700">++;<br />    }<br />    return </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$still_obj1 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">();<br />echo </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$still_obj2 </span><span style="color: #007700">= </span><span style="color: #0000BB">get_instance_noref</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="simpara">
     この例を実行すると以下の出力となります。
    </p>

    <div class="example-contents screen">
<div class="cdata"><pre>
Static object: NULL
Static object: NULL

Static object: NULL
Static object: object(stdClass)#3 (1) {
  [&quot;property&quot;]=&gt;
  int(1)
}
+</pre></div>
    </div>

    <p class="simpara">
     この例は、static変数にリファレンスを代入した時に
     <code class="literal">&amp;get_instance_ref()</code>関数を2回目に
     コールした際に保持されていないことを示しています。
    </p>
   </div>
  </div><?php manual_footer($setup); ?>