<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.namespaces.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.namespaces.rules.php',
    1 => 'Правила разрешения имён',
    2 => 'Правила разрешения имён',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => 'Пространства имён',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.fallback.php',
    1 => 'Возврат к глобальному пространству',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.faq.php',
    1 => 'FAQ',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/namespaces.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.namespaces.rules" class="sect1">
  <h2 class="title">Правила разрешения имён</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   Для целей этих правил разрешения приведём важные определения:
   <dl>
    <strong class="title">Определения имени пространства имён</strong>
    
     <dt>Неполное имя</dt>
     <dd>
      <p class="para">
       Идентификатор без разделителя пространств имён, например <code class="literal">Foo</code>
      </p>
     </dd>
    
    
     <dt>Полное имя</dt>
     <dd>
      <p class="para">
       Идентификатор с разделителем пространств имён, например <code class="literal">Foo\Bar</code>
      </p>
     </dd>
    
    
     <dt>Абсолютное имя</dt>
     <dd>
      <p class="para">
       Идентификатор с разделителем пространств имён, который начинается с разделителя пространств имён,
       например <code class="literal">\Foo\Bar</code>. Пространство имён <code class="literal">\Foo</code> —
       также абсолютное имя.
      </p>
     </dd>
    
    
     <dt>Относительное имя</dt>
     <dd>
      <p class="para">
       Идентификатор, который начинается с ключевого слова <code class="literal">namespace</code>,
       например <code class="literal">namespace\Foo\Bar</code>.
      </p>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Имена разрешаются по следующим правилам:
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Абсолютные имена разрешаются в имя без ведущего разделителя пространства имён.
      Например, <code class="literal">\A\B</code> разрешается в <code class="literal">A\B</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Относительные имена разрешаются в имя с заменой ключевого слова <code class="literal">namespace</code>
      текущим пространством имён. Префикс <code class="literal">namespace\</code> удаляется,
      если имя встречается в глобальном пространстве имён. Например,
      имя <code class="literal">namespace\A</code> внутри пространства имён <code class="literal">X\Y</code> разрешается
      в <code class="literal">X\Y\A</code>. То же имя в глобальном пространстве имён разрешается
      в <code class="literal">A</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      В полных именах первый сегмент имени преобразовывается с учётом текущей таблицы
      импорта класса или пространства имён. Например, если пространство имён <code class="literal">A\B\C</code>
      импортировано как <code class="literal">C</code>, то имя <code class="literal">C\D\E</code> преобразуется
      в <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      В полных именах, если не применялось правило импорта, текущее пространство имён добавляется к имени.
      Например, имя <code class="literal">C\D\E</code> внутри пространства имён <code class="literal">A\B</code>
      разрешится в <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Неполные имена преобразовываются с учётом текущей таблицы импорта
      и типа элемента. То есть имена как у классов преобразовываются с учётом таблицы импорта классов или пространств имён,
      имена функций — с учётом таблицы импорта функций, а константы — таблицы импорта
      констант. Например, при записи <code class="literal">use A\B\C;</code>, вызов <code class="literal">new C()
      </code> разрешается в <code class="literal">A\B\C()</code>. Аналогично, при
      записи <code class="literal">use function A\B\foo;</code> вызов <code class="literal">foo()</code> разрешается
      в <code class="literal">A\B\foo</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      В начало неполных имён, если не применялось правило импорта и имя относится к элементу
      с именем как у класса, добавляется текущее пространство имён. Например,
      имя класса в выражении <code class="literal">new C()</code> внутри пространства имён <code class="literal">A\B</code> разрешится
      в имя <code class="literal">A\B\C</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      В неполных именах, если не применялось правило импорта и имя относится к функции или константе,
      а код лежит за пределами глобального пространства имён,
      имя разрешается при выполнении. Вот как разрешится вызов функции <code class="literal">foo()</code>
      в коде в пространстве имён <code class="literal">A\B</code>:
     </span>
     <ol type="1">
      <li class="listitem">
       <span class="simpara">
        Выполняется поиск функции из текущего пространства имён:
        <code class="literal">A\B\foo()</code>.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        PHP пытается найти и вызвать функцию <code class="literal">foo()</code>
        из <em>глобального пространства имён</em>.
       </span>
      </li>
     </ol>
    </li>
   </ol>
  </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 /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br /><br />use </span><span style="color: #0000BB">B\D</span><span style="color: #007700">, </span><span style="color: #0000BB">C\E </span><span style="color: #007700">as </span><span style="color: #0000BB">F</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Вызовы функций<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();      </span><span style="color: #FF8000">// Сперва пытается вызвать функцию foo, которую определили в пространстве имён A,<br />            // затем вызывает глобальную функцию foo<br /><br /></span><span style="color: #0000BB">\foo</span><span style="color: #007700">();     </span><span style="color: #FF8000">// Вызывает функцию foo, которую определили в глобальном пространстве<br /><br /></span><span style="color: #0000BB">my\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Вызывает функцию foo, которую определили в пространстве имён A\my<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">();        </span><span style="color: #FF8000">// Сперва пытается вызвать функцию F, которую определили в пространстве имён A,<br />            // затем вызывает глобальную функцию F<br /><br />// Ссылки на классы<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">B</span><span style="color: #007700">();    </span><span style="color: #FF8000">// Создаёт объект класса B, который определили в пространстве имён A.<br />            // Если класс не найден, то пытается автоматически загрузить класс A\B<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">D</span><span style="color: #007700">();    </span><span style="color: #FF8000">// Следуя правилам импорта, создаёт объект класса D, который определили в пространстве имён B,<br />            // если класс не найден, то пытается автоматически загрузить класс B\D<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">F</span><span style="color: #007700">();    </span><span style="color: #FF8000">// Следуя правилам импорта, создаёт объект класса E, который определили в пространстве имён C,<br />            // если класс не найден, то пытается автоматически загрузить класс класса C\E<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\B</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Создаёт объект класса B, который определили в глобальном пространстве,<br />            // если класс не найден, то пытается автоматически загрузить класс B<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\D</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Создаёт объект класса D, который определили в глобальном пространстве,<br />            // если класс не найден, то пытается автоматически загрузить класс D<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\F</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Создаёт объект класса F, который определили в глобальном пространстве,<br />            // если класс не найден, то пытается автоматически загрузить класс F<br /><br />// Статические методы и функции пространства имён из другого пространства имён<br /><br /></span><span style="color: #0000BB">B\foo</span><span style="color: #007700">();    </span><span style="color: #FF8000">// Вызывает функцию foo из пространства имён A\B<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Вызывает метод foo из класса B, который определили в пространстве имён A,<br />            // если класс A\B не найден, то пытается автоматически загрузить класс A\B<br /><br /></span><span style="color: #0000BB">D</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Следуя правилам импорта, вызывает метод foo класса D, который определили в пространстве имён B,<br />            // если класс B\D не найден, то пытается автоматически загрузить класс B\D<br /><br /></span><span style="color: #0000BB">\B\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Вызывает функцию foo из пространства имён B<br /><br /></span><span style="color: #0000BB">\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();  </span><span style="color: #FF8000">// Вызывает метод foo класса B из глобального пространства,<br />            // если класс B не найден, то пытается автоматически загрузить класс B<br /><br />// Статические методы и функции пространства имён из текущего пространства имён<br /><br /></span><span style="color: #0000BB">A\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// Вызывает метод foo класса B из пространства имён A\A,<br />              // если класс A\A\B не найден, то пытается автоматически загрузить класс A\A\B<br /><br /></span><span style="color: #0000BB">\A\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();  </span><span style="color: #FF8000">// Вызывает метод foo класса B из пространства имён A,<br />              // если класс A\B не найден, то пытается автоматически загрузить класс A\B</span></span></code></div>
    </div>

   </div>
 </div><?php manual_footer($setup); ?>