<?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 => 'ja',
  ),
  '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' => 'ja',
    '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 />$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 />);<br /></span><span style="color: #0000BB">?&gt;</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 /></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">// この最後のカンマは、8.0.0 より前では許されません。<br /></span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</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 /></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">'and something extra.'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'This is a string, '</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">// 出力は 'This is a string, and something extra.' となります<br /></span><span style="color: #0000BB">?&gt;</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">
     関数は、変数に代入する記法に似たやり方で、
     デフォルト値をパラメーターに定義することができます。
     デフォルト値はパラメーターに引数が指定されなかった場合に使われますが、
     <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> を渡した場合はデフォルト値を代入
     <em>しない</em> ことに特に注意して下さい。
    </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 /></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">"cappuccino"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Making a cup of </span><span style="color: #0000BB">$type</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<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">"espresso"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
     デフォルトパラメータの値には、スカラー値、
     配列、および特殊な型 <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 /></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">"cappuccino"</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">) ? </span><span style="color: #DD0000">"hands" </span><span style="color: #007700">: </span><span style="color: #0000BB">$coffeeMaker</span><span style="color: #007700">;<br />    return </span><span style="color: #DD0000">"Making a cup of "</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">" with </span><span style="color: #0000BB">$device</span><span style="color: #DD0000">.\n"</span><span style="color: #007700">;<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">"cappuccino"</span><span style="color: #007700">, </span><span style="color: #DD0000">"lavazza"</span><span style="color: #007700">), </span><span style="color: #DD0000">"teapot"</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;</span></span></code></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 /></span><span style="color: #007700">class </span><span style="color: #0000BB">DefaultCoffeeMaker </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">brew</span><span style="color: #007700">() {<br />        return </span><span style="color: #DD0000">'Making coffee.'</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">FancyCoffeeMaker </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">brew</span><span style="color: #007700">() {<br />        return </span><span style="color: #DD0000">'Crafting a beautiful coffee just for you.'</span><span style="color: #007700">;<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 />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">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></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 /></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">"bowl"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Making a </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> of </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> yogurt.\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">"raspberry"</span><span style="color: #007700">); </span><span style="color: #FF8000">// $container に "raspberry" を指定します。$flavour ではありません。<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>
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 /></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">"bowl"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Making a </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> of </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> yogurt.\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">"raspberry"</span><span style="color: #007700">); </span><span style="color: #FF8000">// $flavour に "raspberry" を指定します。<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>
Making a bowl of raspberry yogurt.
</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 /></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">"bowl"</span><span style="color: #007700">, </span><span style="color: #0000BB">$flavour </span><span style="color: #007700">= </span><span style="color: #DD0000">"raspberry"</span><span style="color: #007700">, </span><span style="color: #0000BB">$style </span><span style="color: #007700">= </span><span style="color: #DD0000">"Greek"</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #DD0000">"Making a </span><span style="color: #0000BB">$container</span><span style="color: #DD0000"> of </span><span style="color: #0000BB">$flavour</span><span style="color: #DD0000"> </span><span style="color: #0000BB">$style</span><span style="color: #DD0000"> yogurt.\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">"natural"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
Making a bowl of raspberry natural yogurt.
</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> をデフォルトにすることは、
     型が暗黙のうちに nullable であることを示しています。
     この使い方はPHP 8.4.0で非推奨となり、代わりに明示的な
     <a href="language.types.declarations.php#language.types.declarations.nullable" class="link">nullable 型</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 /> </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">// デフォルト値が使われないため、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 /> // PHP 8.1.0以降、$a は暗黙的に必須（必須のパラメータの前にあるため）ですが、<br /> // デフォルトのパラメータ値が null であるため、暗黙的に nullable とみなされます（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">null</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {}<br /> 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">// 推奨される書き方です。<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">
      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> を使った可変長引数をユーザー定義関数でサポートしています。
    </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 /></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 />    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 />    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">);<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>
10
</pre></div>
      </div>
     </div>
    </p>

    <p class="para">
     関数を呼び出すときに <code class="literal">...</code> を使うと、
     配列や <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> を実装した変数やリテラルを引数リストに展開することができます。

     <div class="example" id="example-11">
      <p><strong>例11 引数での <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 /></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">);<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
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 /></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 />    </span><span style="color: #0000BB">$time </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<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 />    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 />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">);<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 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 から名前付き引数が導入されました。
     名前付き引数は、位置ではなく、名前ベースで引数を渡すことを可能にします。
     これによって、引数の意味が自己文書化(self-documenting)され、
     引数を任意の順番で渡せるようになり、任意のデフォルト値を持つ引数をスキップできるようになります。
    </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 />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">);<br /></span><span style="color: #0000BB">?&gt;</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 /></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">);<br /></span><span style="color: #0000BB">?&gt;</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 />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">);<br /></span><span style="color: #0000BB">?&gt;</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 />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 /></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">);<br /></span><span style="color: #0000BB">?&gt;</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 同じ名前の引数を複数回渡すと、Error がスローされる</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</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<br /><br /></span><span style="color: #0000BB">?&gt;</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 /></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 /><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<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

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