<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'control-structures.match.php',
    1 => 'match',
    2 => 'match',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => 'Управляющие конструкции',
  ),
  'prev' => 
  array (
    0 => 'control-structures.switch.php',
    1 => 'switch',
  ),
  'next' => 
  array (
    0 => 'control-structures.declare.php',
    1 => 'declare',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/control-structures/match.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.match" class="sect1">
 <h2 class="title">match</h2>
 <p class="verinfo">(PHP 8)</p>
 <p class="para">
  Выражение <code class="literal">match</code> выбирает ветвь вычисления
  на основе проверки, которая показывает, идентично ли значение условного выражения
  значению входного условного выражения.
  Аналогично инструкции <code class="literal">switch</code> выражение
  <code class="literal">match</code> принимает на вход выражение, которое сравнивается
  с набором альтернатив. В отличие от инструкции <code class="literal">switch</code>,
  выражение сопоставления оценивает значение в стиле, который больше похож на тернарный оператор.
  Выражение выполняет строгое сравнение <code class="code">===</code>, а не слабую проверку на равенство <code class="code">==</code>,
  как это делает инструкция <code class="literal">switch</code>.
  Выражения сопоставления доступны с PHP 8.0.0.
 </p>

 <div class="example" id="example-1">
  <p><strong>Пример #1 Структура выражения <code class="literal">match</code></strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$return_value </span><span style="color: #007700">= match (</span><span style="color: #0000BB">subject_expression</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">single_conditional_expression </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">return_expression</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">conditional_expression1</span><span style="color: #007700">, </span><span style="color: #0000BB">conditional_expression2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">return_expression</span><span style="color: #007700">,<br />};<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>


  <div class="example" id="example-2">
   <p><strong>Пример #2 Базовый пример сопоставления значений в выражении <code class="literal">match</code></strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$food </span><span style="color: #007700">= </span><span style="color: #DD0000">'cake'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$return_value </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$food</span><span style="color: #007700">) {<br />    </span><span style="color: #DD0000">'apple' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'На столе лежит яблоко'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'banana' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'На столе лежит банан'</span><span style="color: #007700">,<br />    </span><span style="color: #DD0000">'cake' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'На столе стоит торт'</span><span style="color: #007700">,<br />};<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$return_value</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>
string(35) &quot;На столе стоит торт&quot;
</pre></div>
   </div>
  </div>

  <div class="example" id="example-3">
   <p><strong>Пример #3 Пример сопоставления значений в выражении <code class="literal">match</code> с операторами сравнения</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$age </span><span style="color: #007700">= </span><span style="color: #0000BB">18</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$output </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Младенец"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">13 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Ребёнок"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&lt;= </span><span style="color: #0000BB">19 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Подросток"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">40 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Взрослый"</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">19 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"Молодой человек"</span><span style="color: #007700">,<br />};<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$output</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>
string(8) &quot;Подросток&quot;
</pre></div>
   </div>
  </div>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Результат выражения <code class="literal">match</code> использовать не обязательно.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Выражение <code class="literal">match</code> <em>должно</em> завершаться
    точкой с запятой <code class="literal">;</code>, если записывается
    как отдельное выражение.
   </span>
  </p></blockquote>
 </div>

 <p class="para">
  Выражение <code class="literal">match</code> похоже на инструкцию
  <code class="literal">switch</code>, за исключением отдельных ключевых отличий:

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     В отличие от нестрогого сравнения в инструкции switch,
     в ветке сопоставления значений в выражении <code class="literal">match</code>
     значения сравниваются строго — <code class="code">===</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Выражение <code class="literal">match</code> возвращает значение
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     В выражении <code class="literal">match</code> выполнение кода не переходит к следующей
     ветви сопоставления значений после первого совпадения значений,
     в отличие от провалов к следующему случаю в инструкции <code class="literal">switch</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Выражение <code class="literal">match</code> должно быть исчерпывающим
    </span>
   </li>
  </ul>
 </p>

 <p class="para">
  Как и инструкциях <code class="literal">switch</code>, в выражениях <code class="literal">match</code>
  ветви сопоставления значений выполняются одна за другой.
  В начале никакой код не выполняется. Условные выражения оцениваются, только если
  предыдущие условные выражения не соответствуют входному выражению.
  Выражение match вычислит только то выражение возврата, которое соответствует
  условному выражению, значение которого совпало.
  Приведём пример:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">foo</span><span style="color: #007700">() =&gt; </span><span style="color: #DD0000">'value'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">() =&gt; ..., </span><span style="color: #FF8000">// Метод $this-&gt;bar() не вызывается, если значение возврата функции foo() === $x<br />    </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">baz </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">beep</span><span style="color: #007700">(), </span><span style="color: #FF8000">// Функция beep() выполнится, если только входное выражение $x === $this-&gt;baz<br />    // и т. д.<br /></span><span style="color: #007700">};<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  Ветвям сопоставления значений в выражении <code class="literal">match</code> разрешается содержать
  множественные выражения, разделённые запятыми.
  Множественные выражения проверяются по условию логического ИЛИ и представляют короткую запись
  для множественных ветвей сопоставления значений с одним и тем выражением в правой части.
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Эта ветвь сопоставления значений:<br />    </span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #0000BB">$c </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #FF8000">// ...эквивалентна следующему набору из трёх ветвей сопоставления:<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />};<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Выражение сопоставления управляет случаями по умолчанию через шаблон <code class="literal">default</code>.
  Управление переходит к шаблону по умолчанию при несовпадении значений в предыдущих ветвях сопоставления.
  Например:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$expressionResult </span><span style="color: #007700">= match (</span><span style="color: #0000BB">$condition</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">foo</span><span style="color: #007700">(),<br />    </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">bar</span><span style="color: #007700">(),<br />    default =&gt; </span><span style="color: #0000BB">baz</span><span style="color: #007700">(),<br />};<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Многократные шаблоны default вызовут ошибку уровня <strong><code>E_FATAL_ERROR</code></strong>.
   </span>
  </p></blockquote>
 </p>

 <p class="para">
  Выражение <code class="literal">match</code> должно быть исчерпывающим.
  Выражение выбрасывает исключение <span class="classname"><a href="class.unhandledmatcherror.php" class="classname">UnhandledMatchError</a></span>,
  если входное выражение не обработала ни одна ветвь сопоставления.
 </p>

 <div class="example" id="example-4">
  <p><strong>Пример #4 Пример необработанного выражения match</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$condition </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br /><br />try {<br />    match (</span><span style="color: #0000BB">$condition</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">foo</span><span style="color: #007700">(),<br />        </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">bar</span><span style="color: #007700">(),<br />    };<br />} catch (</span><span style="color: #0000BB">\UnhandledMatchError $e</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">);<br />}<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>
object(UnhandledMatchError)#1 (7) {
  [&quot;message&quot;:protected]=&gt;
  string(33) &quot;Unhandled match value of type int&quot;
  [&quot;string&quot;:&quot;Error&quot;:private]=&gt;
  string(0) &quot;&quot;
  [&quot;code&quot;:protected]=&gt;
  int(0)
  [&quot;file&quot;:protected]=&gt;
  string(9) &quot;/in/ICgGK&quot;
  [&quot;line&quot;:protected]=&gt;
  int(6)
  [&quot;trace&quot;:&quot;Error&quot;:private]=&gt;
  array(0) {
  }
  [&quot;previous&quot;:&quot;Error&quot;:private]=&gt;
  NULL
}
</pre></div>
  </div>
 </div>

 <div class="sect2">
  <h3 class="title">Обработка проверок с нетождественными условиями в выражениях match</h3>
  <p class="para">
   Выражение <code class="literal">match</code> умеет обрабатывать случаи с нетождественными условиями.
   Для этого входное выражении указывают как значение <code class="code">true</code>.
  </p>

  <div class="example" id="example-5">
   <p><strong>Пример #5 Пример обобщения выражения match для ветвления на основе целочисленных диапазонов</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$age </span><span style="color: #007700">= </span><span style="color: #0000BB">23</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">65 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'пожилой'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">25 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'взрослый'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$age </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">18 </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'совершеннолетний'</span><span style="color: #007700">,<br />    default =&gt; </span><span style="color: #DD0000">'ребёнок'</span><span style="color: #007700">,<br />};<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</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>
string(11) &quot;совершеннолетний&quot;
</pre></div>
   </div>
  </div>

  <div class="example" id="example-6">
   <p><strong>Пример #6 Пример обобщения выражения match для выбора ветви вычисления на основе содержимого строки</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$text </span><span style="color: #007700">= </span><span style="color: #DD0000">'Bienvenue chez nous'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= match (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Welcome'</span><span style="color: #007700">), </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Hello'</span><span style="color: #007700">) =&gt; </span><span style="color: #DD0000">'en'</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bienvenue'</span><span style="color: #007700">), </span><span style="color: #0000BB">str_contains</span><span style="color: #007700">(</span><span style="color: #0000BB">$text</span><span style="color: #007700">, </span><span style="color: #DD0000">'Bonjour'</span><span style="color: #007700">) =&gt; </span><span style="color: #DD0000">'fr'</span><span style="color: #007700">,<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">};<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</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>
string(2) &quot;fr&quot;
</pre></div>
   </div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>