<?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 => 'ru',
  ),
  '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' => 'ru',
    '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 предусмотрели область видимости функции и глобальную область видимости.
   Переменная, которую определили за пределами функции, ограничивается глобальной областью видимости.
   Код включаемого файла наследует ту же область видимости переменных,
   что и строка, на которой включается файл.
  </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 /><br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />include </span><span style="color: #DD0000">'b.inc'</span><span style="color: #007700">; </span><span style="color: #FF8000">// Код внутри файла b.inc получит доступ к переменной $a<br /><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> вместо этого
   связывают переменные родительской области видимости и переменные становятся доступны в теле стрелочной функции.
   При включении файла внутри функции переменные, которые содержатся во включаемом файле,
   будут доступны так, как будто переменные определили внутри вызывающей функции.
  </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 /><br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// Определяем переменную $a в глобальной области видимости<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 не определена, поскольку конструкция echo указывает на локальную версию переменной $a<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="simpara">
   До PHP 8.0.0 при вызове функции приведённый пример сгенерирует ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>
   о неопределённой переменной, а в новых версиях ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</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 /><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 /><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">
    Второй способ доступа к переменным глобальной области видимости —
    суперглобальный 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 
      Работа с суперглобальной переменной <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var>
      вместо ключевого слова global
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 /><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> доступна в любой области видимости,
    причина состоит в том, что <var class="varname"><a href="reserved.variables.globals.php" class="classname">$GLOBALS</a></var> —
    <a href="language.variables.superglobals.php" class="link">суперглобальная переменная</a>.
    Пример ниже показывает силу суперглобальных переменных:
   </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 /><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 /><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">
    Переменные, которые определили через ключевое слово <code class="literal">static</code>
   </h3>
   <p class="simpara">
    Другая важная особенность области видимости переменной —
    <em>статическая</em> переменная. Статическая
    переменная доступна только в локальной области видимости
    функции, но не теряет своего значения, когда выполнение программы
    выходит из этой области видимости. Рассмотрим следующий пример:
   </p>
   <p class="para">
    <div class="example" id="example-6">
     <p><strong>Пример #6 
      Пример показывает, когда требуется статическая переменная
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 /><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>. Инкремент переменной <var class="varname">$a</var>++
    здесь не играет роли, поскольку при выходе из функции переменная
    <var class="varname">$a</var> исчезает. Чтобы написать полезную
    функцию подсчёта, которая не потеряет текущего значения счётчика,
    переменную <var class="varname">$a</var> объявляют статической:
   </p>
   <p class="para">
    <div class="example" id="example-7">
     <p><strong>Пример #7 Пример со статической переменной</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 /><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">
    Со статическими переменными также работают в рекурсивных функциях.
    Следующая функция рекурсивно считает до 10, а статическая переменная
    <var class="varname">$count</var> помогает определить момент остановки:
   </p>
   <p class="para">
    <div class="example" id="example-8">
     <p><strong>Пример #8 Статические переменные и рекурсивные функции</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 /><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 /><br />    </span><span style="color: #0000BB">$count</span><span style="color: #007700">--;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>

   <p class="para">
    До PHP 8.3.0 статические переменные разрешалось инициализировать
    только константными выражениями. С PHP 8.3.0 также разрешили
    динамические выражения наподобие вызовов функций:
   </p>
   <p class="para">
    <div class="example" id="example-9">
     <p><strong>Пример #9 Объявление статических переменных</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />{<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 /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
   </p>

   <p class="simpara">
    Статические переменные внутри анонимных функций сохраняются только внутри этого
    конкретного экземпляра функции. Статическая переменная переинициализируется,
    если анонимная функция воссоздаётся при каждом вызове.
   </p>
   <div class="example" id="example-10">
    <p><strong>Пример #10 Статические переменные в анонимных функциях</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 />{<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">"Функция получила значение: </span><span style="color: #0000BB">$input</span><span style="color: #DD0000">, счётчик: </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">// Вызов функции exampleFunction пересоздаст анонимную функцию, поэтому статическая<br />// переменная не сохранит значение<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">// Выводит: Функция получила значение: A, счётчик: 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">// Выводит: Функция получила значение: B, счётчик: 1<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    Начиная с PHP 8.1.0 при наследовании, но не переопределении, метода
    со статическими переменными унаследованный метод будет использовать
    статические переменные совместно с родительским методом.
    Поэтому статические переменные в методах теперь ведут себя
    как статические свойства класса.
   </p>

   <p class="simpara">
    Начиная PHP 8.3.0 статические переменные разрешили инициализировать произвольными выражениями.
    Поэтому статическую переменную получится инициализировать, например, вызовом метода.
   </p>

   <div class="example" id="example-11">
    <p><strong>Пример #11 
     Статические переменные в унаследованных методах
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">counter</span><span style="color: #007700">()<br />    {<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 /><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 /><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 /><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">
    Ссылки с глобальными (<code class="literal">global</code>)
    и статическими (<code class="literal">static</code>) переменными
   </h3>
   <p class="simpara">
    PHP использует модификаторы переменных
    <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> как
    <a href="language.references.php" class="link">ссылки</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 /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test_global_ref</span><span style="color: #007700">()<br />{<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 />{<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 /><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>. Ссылки не
    хранятся статично:
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function &amp;</span><span style="color: #0000BB">get_instance_ref</span><span style="color: #007700">()<br />{<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Статический объект: '</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 /><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 /><br />        </span><span style="color: #FF8000">// Присвоить ссылку статической переменной<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 />    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 /><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 />{<br />    static </span><span style="color: #0000BB">$obj</span><span style="color: #007700">;<br /><br />    echo </span><span style="color: #DD0000">'Статический объект: '</span><span style="color: #007700">;<br /><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 /><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 /><br />        </span><span style="color: #FF8000">// Присвоить объект статической переменной<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 />    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 /><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 /><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
Статический объект: NULL

Статический объект: NULL
Статический объект: object(stdClass)#3 (1) {
  [&quot;property&quot;]=&gt;
  int(1)
}
</pre></div>
   </div>

   <p class="simpara">
    Пример показывает, что при назначении ссылки статической
    переменной эта переменная <em>не запоминается</em>,
    при повторном вызове функции <code class="literal">&amp;get_instance_ref()</code>.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>