<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.functions.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'functions.arguments.php',
    1 => 'Параметры и аргументы функции',
    2 => 'Параметры и аргументы функции',
  ),
  'up' => 
  array (
    0 => 'language.functions.php',
    1 => 'Функции',
  ),
  'prev' => 
  array (
    0 => 'functions.user-defined.php',
    1 => 'Пользовательские функции',
  ),
  'next' => 
  array (
    0 => 'functions.returning-values.php',
    1 => 'Возврат значений',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/functions.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="functions.arguments" class="sect1">
  <h2 class="title">Параметры и аргументы функции</h2>

  <p class="simpara">
   Параметры объявляются в сигнатуре функции. Информацию в параметры функции передают в списке аргументов.
   Список аргументов состоит из выражений, которые разделяют запятыми. Выражения
   в списке аргументов вычисляются слева направо, а результат вычислений присваивается параметрам
   перед действительным вызовом функции. Такое вычисление называется <em>упреждающим</em>.
  </p>

  
  <p class="para">
   PHP поддерживает передачу аргументов по значению, это поведение по умолчанию,
   и <a href="functions.arguments.php#functions.arguments.by-reference" class="link">по ссылке</a>,
   и <a href="functions.arguments.php#functions.arguments.default" class="link">значения по умолчанию</a>.
   <a href="functions.arguments.php#functions.variable-arg-list" class="link">Списки аргументов
   переменной длины</a> и <a href="functions.arguments.php#functions.named-arguments" class="link">именованные
   аргументы</a> тоже поддерживаются.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    С PHP 7.3.0 список аргументов при вызове функций допускает
    завершающую запятую:
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$v </span><span style="color: #007700">= </span><span style="color: #0000BB">foo</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$arg_1</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$arg_2</span><span style="color: #007700">,<br />);</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>

  <p class="para">
   Начиная с PHP 8.0.0 список параметров функции допускает завершающую
   запятую, которую парсер проигнорирует. Это полезно, когда список параметров
   длинный или содержит длинные названия переменных, что в целях удобства подталкивает
   к вертикальному перечислению параметров.
  </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">function </span><span style="color: #0000BB">takes_many_args</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$first_arg</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$second_arg</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$a_very_long_argument_name</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$arg_with_default </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br />    </span><span style="color: #0000BB">$again </span><span style="color: #007700">= </span><span style="color: #DD0000">'a default string'</span><span style="color: #007700">, </span><span style="color: #FF8000">// До PHP 8.0.0 указывать запятую в конце списка не разрешали<br /></span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}</span></span></code></div>
    </div>

  </div>

  <div class="sect2" id="functions.arguments.by-reference">
   <h3 class="title">Передача аргументов по ссылке</h3>

   <p class="simpara">
    По умолчанию аргументы передаются в функцию по значению. Поэтому
    если значение аргумента внутри функции изменится, значение
    переменной, в которой передали аргумент, не изменится за пределами функции.
    Аргументы передают по ссылке, чтобы разрешить функции изменять значения аргументов.
   </p>
   <p class="para">
    В описании функции перед именем параметра указывают амперсанд &amp;,
    когда требуется передача аргумента по ссылке:
   </p>
   <p class="para">
    <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 /></span><span style="color: #007700">function </span><span style="color: #0000BB">add_some_extra</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">$string</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$string </span><span style="color: #007700">.= </span><span style="color: #DD0000">'и кое-что ещё.'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'Это строка, '</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">add_some_extra</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$str</span><span style="color: #007700">;    </span><span style="color: #FF8000">// Конструкция выведет «Это строка, и кое-что ещё.»</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="para">
    Передача в аргументе константного выражения в параметр, который ожидает значение по ссылке, вызовет ошибку.
    </p>
  </div>
  <div class="sect2" id="functions.arguments.default">
   <h3 class="title">Значения по умолчанию для параметров</h3>

   <p class="para">
    Функция умеет определять для параметров значения по умолчанию,
    в этом помогает синтаксис, который похож на синтаксис присваивания значения переменной.
    Функция присвоит параметру значение по умолчанию, только если
    в параметр не передали аргумент;
    обратите внимание, функция <em>не</em> присваивает
    параметру значение по умолчанию при передаче в параметр аргумента со значением <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 Значения по умолчанию для параметров функций</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">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">$type </span><span style="color: #007700">= </span><span style="color: #DD0000">"капучино"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Готовим чашку </span><span style="color: #0000BB">$type</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">null</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #DD0000">"эспрессо"</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
Готовим чашку капучино.
Готовим чашку .
Готовим чашку эспрессо.
</pre></div>
     </div>
    </div>
   </p>
   <p class="para">
    Значениями по умолчанию для параметров разрешается указывать скалярные значения,
    массивы (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>), специальный тип <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> и начиная с PHP 8.1.0 объекты,
    которые создают синтаксисом <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new ClassName()</a>.
   </p>
   <p class="para">
    <div class="example" id="example-4">
     <p><strong>Пример #4 Нескалярные типы как значения по умолчанию</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">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">$types </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"капучино"</span><span style="color: #007700">), </span><span style="color: #0000BB">$coffeeMaker </span><span style="color: #007700">= </span><span style="color: #0000BB">NULL</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$device </span><span style="color: #007700">= </span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$coffeeMaker</span><span style="color: #007700">)<br />        ? </span><span style="color: #DD0000">"вручную"<br />        </span><span style="color: #007700">: </span><span style="color: #0000BB">$coffeeMaker<br />    </span><span style="color: #007700">;<br /><br />    return </span><span style="color: #DD0000">"Готовлю чашку " </span><span style="color: #007700">. </span><span style="color: #0000BB">join</span><span style="color: #007700">(</span><span style="color: #DD0000">", "</span><span style="color: #007700">, </span><span style="color: #0000BB">$types</span><span style="color: #007700">) . </span><span style="color: #DD0000">" </span><span style="color: #0000BB">$device</span><span style="color: #DD0000">. \n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(array(</span><span style="color: #DD0000">"капучино"</span><span style="color: #007700">, </span><span style="color: #DD0000">"лавацца"</span><span style="color: #007700">), </span><span style="color: #DD0000">"в чайнике"</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

      <div class="example-contents screen">
<div class="cdata"><pre>
Готовлю чашку капучино вручную.
Готовлю чашку капучино, лавацца в чайнике.
</pre></div>
      </div>
    </div>
   </p>
   <p class="para">
    <div class="example" id="example-5">
     <p><strong>Пример #5 
      Объекты как значения по умолчанию, с PHP 8.1.0
     </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">DefaultCoffeeMaker<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">brew</span><span style="color: #007700">()<br />    {<br />        return </span><span style="color: #DD0000">"Приготовление кофе.\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">FancyCoffeeMaker<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">brew</span><span style="color: #007700">()<br />    {<br />        return </span><span style="color: #DD0000">"Приготовление прекрасного кофе только для вас.\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />function </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(</span><span style="color: #0000BB">$coffeeMaker </span><span style="color: #007700">= new </span><span style="color: #0000BB">DefaultCoffeeMaker</span><span style="color: #007700">())<br />{<br />    return </span><span style="color: #0000BB">$coffeeMaker</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">brew</span><span style="color: #007700">();<br />}<br /><br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">makecoffee</span><span style="color: #007700">(new </span><span style="color: #0000BB">FancyCoffeeMaker</span><span style="color: #007700">);</span></span></code></div>
     </div>


     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

      <div class="example-contents screen">
<div class="cdata"><pre>
Приготовление кофе.
Приготовление прекрасного кофе только для вас.
</pre></div>
      </div>
    </div>
   </p>
   <p class="simpara">
    Объект как значение по умолчанию разрешается определять только константным выражением,
    а не переменной, вызовом функции или метода класса.
   </p>
   <p class="para">
    Обратите внимание, необязательные параметры потребуется указать
    после обязательных, иначе необязательные параметры
    не получится пропустить при вызове, поскольку функция рассматривает необязательные параметры,
    которые указали перед обязательными, как обязательные.
    Рассмотрим следующий пример:
   </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">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$container </span><span style="color: #007700">= </span><span style="color: #DD0000">"миску"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Делаем </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> с </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> йогуртом.\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #DD0000">"малиновым"</span><span style="color: #007700">); </span><span style="color: #FF8000">// Значение «малиновым» получит параметр $container, а не параметр $flavour</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArgumentCountError: Too few arguments
to function makeyogurt(), 1 passed in example.php on line 42
</pre></div>
     </div>
    </div>
   </p>
   <p class="para">
    Теперь сравним приведённый пример со следующим примером:
   </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">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$flavour</span><span style="color: #007700">, </span><span style="color: #0000BB">$container </span><span style="color: #007700">= </span><span style="color: #DD0000">"миску"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Делаем </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> с </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> йогуртом.\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #DD0000">"малиновым"</span><span style="color: #007700">); </span><span style="color: #FF8000">// Значение «малиновым» получит параметр $flavour</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
Делаем миску с малиновым йогуртом.
</pre></div>
     </div>
    </div>
   </p>
   <p class="para">
    Начиная с PHP 8.0.0 для пропуска необязательных параметров
    передают <a href="functions.arguments.php#functions.named-arguments" class="link">именованные аргументы</a>.
   </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">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">$container </span><span style="color: #007700">= </span><span style="color: #DD0000">"миску"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour </span><span style="color: #007700">= </span><span style="color: #DD0000">"малиновым"</span><span style="color: #007700">, </span><span style="color: #0000BB">$style </span><span style="color: #007700">= </span><span style="color: #DD0000">"греческим"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Делаем </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> с </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> </span><span style="color: #0000BB">$style</span><span style="color: #DD0000"> йогуртом.\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">makeyogurt</span><span style="color: #007700">(</span><span style="color: #0000BB">style</span><span style="color: #007700">: </span><span style="color: #DD0000">"натуральным"</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
Делаем миску с малиновым натуральным йогуртом.
</pre></div>
     </div>
    </div>
   </p>
   <p class="para">
    Начиная с PHP 8.0.0 объявление обязательных параметров после необязательных
    <em>устарело</em>.
    Часто из таких ситуаций выходят путём отказа от значения по умолчанию,
    поскольку функция никогда не присвоит параметру, в который передали аргумент,
    значение по умолчанию.
    Исключение из этого правила — параметры вида <code class="code">Type $param = null</code>,
    где значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> по умолчанию делает тип неявно обнуляемым.
    Такое определение устарело с PHP 8.4.0
    и теперь <a href="language.types.declarations.php#language.types.declarations.nullable" class="link">обнуляемый тип</a>
    потребуется указать явно.
    <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">(</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: #FF8000">// Функция никогда не присвоит значение по умолчанию;<br />                                 // определение значения по умолчанию для параметра, который идёт<br />                                 // перед обязательным, устарело с PHP 8.0.0<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</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">) {}          </span><span style="color: #FF8000">// Определение функционально эквивалентно, но не выдаёт уведомление об устаревании<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">bar</span><span style="color: #007700">(</span><span style="color: #0000BB">A $a </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {} </span><span style="color: #FF8000">// С PHP 8.1.0 параметр $a неявно обязателен, поскольку идёт перед обязательным,<br />                                 // но неявно обнуляем, поскольку для параметра определили значение по умолчанию null.<br />                                 // Объявления значения по умолчанию null<br />                                 // без указания обнуляемого типа устарело с PHP 8.4.0<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">bar</span><span style="color: #007700">(?</span><span style="color: #0000BB">A $a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {}       </span><span style="color: #FF8000">// Определение, которое рекомендуют</span></span></code></div>
     </div>

    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     Начиная с PHP 7.1.0 пропуск аргумента для параметра, для которого не задали
     значение по умолчанию, выбрасывает исключение
     <span class="classname"><a href="class.argumentcounterror.php" class="classname">ArgumentCountError</a></span>;
     в предыдущих версиях выдавалось предупреждение.
    </span>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     Параметрам, которые ожидают аргумент по ссылке,
     разрешается устанавливать значения по умолчанию.
    </span>
   </p></blockquote>
  </div>

  <div class="sect2" id="functions.variable-arg-list">
   <h3 class="title">Списки аргументов переменной длины</h3>

   <p class="simpara">
    В пользовательских функциях PHP поддерживает списки аргументов
    переменной длины, параметры для которых определяют оператором из трёх точек
    <code class="literal">...</code>, который называется spread-оператором.
   </p>

   <p class="para">
    Списку параметров разрешается содержать оператор
    <code class="literal">...</code>, чтобы показать, что функция принимает переменное
    количество аргументов. Переменная получит аргументы как массив:

    <div class="example" id="example-10">
     <p><strong>Пример #10 
      Оператор <code class="literal">...</code> для доступа к аргументам
     </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">sum</span><span style="color: #007700">(...</span><span style="color: #0000BB">$numbers</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$acc </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />    foreach (</span><span style="color: #0000BB">$numbers </span><span style="color: #007700">as </span><span style="color: #0000BB">$n</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$acc </span><span style="color: #007700">+= </span><span style="color: #0000BB">$n</span><span style="color: #007700">;<br />    }<br /><br />    return </span><span style="color: #0000BB">$acc</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #0000BB">sum</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: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
10
</pre></div>
     </div>
    </div>
   </p>

   <p class="para">
    Spread-оператор <code class="literal">...</code> указывают также при вызове функции,
    чтобы распаковать в список аргументов массив (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>),
    или распаковать переменную или литерал, которые принадлежат типу
    <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span>:

    <div class="example" id="example-11">
     <p><strong>Пример #11 
      Передача аргументов со spread-оператором <code class="literal">...</code>
     </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">add</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 />    return </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 />echo </span><span style="color: #0000BB">add</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: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$a </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">];<br />echo </span><span style="color: #0000BB">add</span><span style="color: #007700">(...</span><span style="color: #0000BB">$a</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
3
3
</pre></div>
     </div>
    </div>
   </p>

   <p class="para">
    Стандартные позиционные параметры разрешается указывать перед токеном <code class="literal">...</code>,
    тогда оператор <code class="literal">...</code> сгенерирует и добавит в массив только конечные аргументы,
    которые не соответствуют позиционным.
   </p>

   <p class="para">
    Перед оператором <code class="literal">...</code> разрешается также добавлять
    <a href="language.types.declarations.php" class="link">объявление типа</a>.
    Тогда функция проверит, что аргументы, которые захватил оператор <code class="literal">...</code>,
    соответствуют типу параметра, или выбросит ошибку.

    <div class="example" id="example-12">
     <p><strong>Пример #12 Объявление типа для параметра, который ожидает аргументы переменной длины</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">total_intervals</span><span style="color: #007700">(</span><span style="color: #0000BB">$unit</span><span style="color: #007700">, </span><span style="color: #0000BB">DateInterval </span><span style="color: #007700">...</span><span style="color: #0000BB">$intervals</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$time </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />    foreach (</span><span style="color: #0000BB">$intervals </span><span style="color: #007700">as </span><span style="color: #0000BB">$interval</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$time </span><span style="color: #007700">+= </span><span style="color: #0000BB">$interval</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">$unit</span><span style="color: #007700">;<br />    }<br /><br />    return </span><span style="color: #0000BB">$time</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateInterval</span><span style="color: #007700">(</span><span style="color: #DD0000">'P1D'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">DateInterval</span><span style="color: #007700">(</span><span style="color: #DD0000">'P2D'</span><span style="color: #007700">);<br /><br />echo </span><span style="color: #0000BB">total_intervals</span><span style="color: #007700">(</span><span style="color: #DD0000">'d'</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">).</span><span style="color: #DD0000">' days'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Это не сработает, поскольку null — не объект класса DateInterval<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">total_intervals</span><span style="color: #007700">(</span><span style="color: #DD0000">'d'</span><span style="color: #007700">, </span><span style="color: #0000BB">null</span><span style="color: #007700">);</span></span></code></div>
     </div>

     
<div class="example-contents"><p>
 Результат выполнения приведённого примера:
</p></div>

     <div class="example-contents screen">
<div class="cdata"><pre>
3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
</pre></div>
     </div>
    </div>
   </p>

   <p class="para">
    В финале добавим, что аргументы переменной длины разрешается также передавать
    <a href="functions.arguments.php#functions.arguments.by-reference" class="link">по ссылке</a>,
    для этого перед оператором <code class="literal">...</code> указывают амперсанд
    (<code class="literal">&amp;</code>).
   </p>

  </div>

  <div class="sect2" id="functions.named-arguments">
    <h3 class="title">Именованные аргументы</h3>

    <p class="para">
     В PHP 8.0.0 как расширение позиционных параметров появились именованные аргументы.
     Именованные аргументы передаются в функцию на основе имени, а не позиции параметра.
     Назначение аргумента документирует само себя, аргументы перестают зависеть от порядка,
     в котором передаются, и разрешается произвольно пропускать значения по умолчанию.
    </p>

    <p class="para">
     Именованные аргументы передают по названию параметра, за которым идёт
     двоеточие и значение аргумента.
     Зарезервированные ключевые слова разрешается указывать как имена параметров.
     Название параметра потребуется указать как идентификатор, нельзя указывать динамические имена
     параметров.
    </p>

    <div class="example" id="example-13">
     <p><strong>Пример #13 Синтаксис именованного аргумента</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />myFunction</span><span style="color: #007700">(</span><span style="color: #0000BB">paramName</span><span style="color: #007700">: </span><span style="color: #0000BB">$value</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">array_foobar</span><span style="color: #007700">(array: </span><span style="color: #0000BB">$value</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// НЕ поддерживается<br /></span><span style="color: #0000BB">function_name</span><span style="color: #007700">(</span><span style="color: #0000BB">$variableStoringParamName</span><span style="color: #007700">: </span><span style="color: #0000BB">$value</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>

    <div class="example" id="example-14">
     <p><strong>Пример #14 
      Сравнение позиционных и именованных аргументов
     </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: #FF8000">// Передача позиционных аргументов:<br /></span><span style="color: #0000BB">array_fill</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">100</span><span style="color: #007700">, </span><span style="color: #0000BB">50</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Передача именованных аргументов:<br /></span><span style="color: #0000BB">array_fill</span><span style="color: #007700">(</span><span style="color: #0000BB">start_index</span><span style="color: #007700">: </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">count</span><span style="color: #007700">: </span><span style="color: #0000BB">100</span><span style="color: #007700">, </span><span style="color: #0000BB">value</span><span style="color: #007700">: </span><span style="color: #0000BB">50</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>

    <p class="para">
     Порядок передачи именованных аргументов неважен.
    </p>

    <div class="example" id="example-15">
     <p><strong>Пример #15 
      Тот же пример, но с другим порядком аргументов
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />array_fill</span><span style="color: #007700">(</span><span style="color: #0000BB">value</span><span style="color: #007700">: </span><span style="color: #0000BB">50</span><span style="color: #007700">, </span><span style="color: #0000BB">count</span><span style="color: #007700">: </span><span style="color: #0000BB">100</span><span style="color: #007700">, </span><span style="color: #0000BB">start_index</span><span style="color: #007700">: </span><span style="color: #0000BB">0</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>

    <p class="para">
     Именованные аргументы разрешается комбинировать с позиционными.
     Тогда именованные аргументы потребуется передать после позиционных.
     Разрешается также передавать только часть необязательных аргументов
     функции в произвольном порядке.
    </p>

    <div class="example" id="example-16">
     <p><strong>Пример #16 
      Объединение именованных аргументов с позиционными аргументами
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">, </span><span style="color: #0000BB">double_encode</span><span style="color: #007700">: </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Аналогично<br /></span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$string</span><span style="color: #007700">, </span><span style="color: #0000BB">ENT_QUOTES </span><span style="color: #007700">| </span><span style="color: #0000BB">ENT_SUBSTITUTE </span><span style="color: #007700">| </span><span style="color: #0000BB">ENT_HTML401</span><span style="color: #007700">, </span><span style="color: #DD0000">'UTF-8'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>

    <p class="para">
     При передаче именованных аргументов с одним и тем же названием параметра
     выбрасывается ошибка <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
    </p>

    <div class="example" id="example-17">
     <p><strong>Пример #17 
      Ошибка, которая возникает при передаче нескольких аргументов с названием
      одного и того же параметра
     </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">(</span><span style="color: #0000BB">$param</span><span style="color: #007700">) {}<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">param</span><span style="color: #007700">: </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">param</span><span style="color: #007700">: </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Error: Named parameter $param overwrites previous argument<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">param</span><span style="color: #007700">: </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Error: Named parameter $param overwrites previous argument</span></span></code></div>
     </div>

    </div>

   <p class="para">
    Начиная с PHP 8.1.0 разрешается передавать именованные аргументы
    после распаковки аргументов. Именованный аргумент <em>не должен</em>
    переопределять распакованный аргумент.
   </p>

   <div class="example" id="example-18">
    <p><strong>Пример #18 
     Передача именованных аргументов после распаковки
    </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">(</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">= </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">$d </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">) {<br />    return </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">+ </span><span style="color: #0000BB">$d</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">foo</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: #0000BB">d</span><span style="color: #007700">: </span><span style="color: #0000BB">40</span><span style="color: #007700">)); </span><span style="color: #FF8000">// 46<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: #DD0000">'b' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">'a' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">], </span><span style="color: #0000BB">d</span><span style="color: #007700">: </span><span style="color: #0000BB">40</span><span style="color: #007700">)); </span><span style="color: #FF8000">// 46<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">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">], </span><span style="color: #0000BB">b</span><span style="color: #007700">: </span><span style="color: #0000BB">20</span><span style="color: #007700">)); </span><span style="color: #FF8000">// Fatal error: Named parameter $b overwrites previous argument</span></span></code></div>
    </div>

   </div>

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