<?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.user-defined.php',
    1 => 'ユーザー定義関数',
    2 => 'ユーザー定義関数',
  ),
  'up' => 
  array (
    0 => 'language.functions.php',
    1 => '関数',
  ),
  'prev' => 
  array (
    0 => 'language.functions.php',
    1 => '関数',
  ),
  'next' => 
  array (
    0 => 'functions.arguments.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.user-defined" class="sect1">
   <h2 class="title">ユーザー定義関数</h2>
 
   <p class="para">
    関数は、<code class="literal">function</code> キーワードと関数の名前、
    カンマ(<code class="literal">,</code>) で区切ったパラメーターのリスト
    （空であっても構いません）を括弧で囲み、
    関数の本体を波括弧で囲んだものを続けて定義します。
    たとえば、以下のようになります:
   </p>
   <div class="example" id="example-1">
    <p><strong>例1 <code class="literal">foo</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">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$arg_1</span><span style="color: #007700">, </span><span style="color: #0000BB">$arg_2</span><span style="color: #007700">, </span><span style="color: #FF8000">/* ..., */ </span><span style="color: #0000BB">$arg_n</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #DD0000">"関数の例\n"</span><span style="color: #007700">;<br />    return </span><span style="color: #0000BB">$retval</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <p class="para">
     PHP 8.0.0 以降では、
     パラメーターのリストの末尾に、カンマを付加できるようになっています:
     <div class="informalexample">
      <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">$arg_1</span><span style="color: #007700">, </span><span style="color: #0000BB">$arg_2</span><span style="color: #007700">,) { }<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

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

   <p class="simpara">
    関数の本体の中では、
    他の関数や <a href="language.oop5.basic.php#language.oop5.basic.class" class="link">クラス</a>
    定義を含む PHP のあらゆる有効なコードを使用することができます。
   </p>
   <p class="para">
    関数名は、PHP の他のラベルと同じ規則に従います。関数名として有効な
    形式は、まず文字かアンダースコアで始まり、その後に任意の数の文字・
    数字・あるいはアンダースコアが続くものです。正規表現で表すと、
    <code class="code">^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>
    となります。
   </p>
   <div class="tip"><strong class="tip">ヒント</strong><p class="simpara">
<a href="userlandnaming.php" class="xref">ユーザーレベルでの命名の手引き</a> も参照ください。</p></div>
   <p class="simpara">
    PHP では、関数は参照される前に定義されている必要はありません。
    ただし以下の二つの例のように、条件付きで関数が
    定義されるような場合を<em>除きます</em>。
   </p>
   <p class="para">
    次の二つの例のように、ある条件下でのみ関数が定義される場合には、
    その関数定義は関数がコールされる<em>前に</em>
    行われていなければなりません。
   </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 />$makefoo </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">/* ここでは関数foo()はまだ定義されていないので<br />   コールすることはできません。<br />   しかし関数 bar()はコールできます。 */<br /><br /></span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br />if (</span><span style="color: #0000BB">$makefoo</span><span style="color: #007700">) {<br />  function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />  {<br />    echo </span><span style="color: #DD0000">"I don't exist until program execution reaches me.\n"</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* ここでは $makefooがtrueと評価されているため <br />   安全にfoo()をコールすることができます。 */<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$makefoo</span><span style="color: #007700">) </span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br />function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() <br />{<br />  echo </span><span style="color: #DD0000">"I exist immediately upon program start.\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </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">foo</span><span style="color: #007700">() <br />{<br />  function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() <br />  {<br />    echo </span><span style="color: #DD0000">"I don't exist until foo() is called.\n"</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* ここでは関数bar()はまだ定義されていないので<br />   コールすることはできません。 */<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/* foo()の実行によって bar()が<br />   定義されるためここではbar()を<br />   コールすることができます。*/<br /><br /></span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="para">
    PHP では、関数やクラスはすべてグローバルスコープにあります -
    関数の内部で定義したものであっても関数の外部からコールできますし、
    その逆も可能です。
   </p>
   <p class="simpara">
    PHP は関数のオーバーロードをサポートしていません。
    また、宣言された関数の定義を取り消したり再定義することも
    できません。
   </p>
   <blockquote class="note"><p><strong class="note">注意</strong>: 
    <span class="simpara">
     関数名は ASCII 文字 <code class="literal">A</code> から <code class="literal">Z</code> で構成されている場合、
     大文字小文字を区別しませんが、
     通常は関数宣言時と同じ名前で関数をコールする方が好ましいです。
    </span>
   </p></blockquote>   
   <p class="simpara">
    <a href="functions.arguments.php#functions.variable-arg-list" class="link">可変引数</a>
    および <a href="functions.arguments.php#functions.arguments.default" class="link">デフォルト引数</a>
    の機能をサポートしています。
    <span class="function"><a href="function.func-num-args.php" class="function">func_num_args()</a></span>,
    <span class="function"><a href="function.func-get-arg.php" class="function">func_get_arg()</a></span>, 
    <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span> に関する関数リファレンスを
    参照ください。
   </p>
   
   <p class="para">
    PHP では、関数を再帰的にコールすることが可能です。
    <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">recursion</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">)<br />{<br />    if (</span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">20</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"</span><span style="color: #0000BB">$a</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">recursion</span><span style="color: #007700">(</span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</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">
     100 から 200 を超えるようなレベルの再帰呼び出しは避けてください。そんなことをすると、
     スタックが破壊され、スクリプトが異常終了してしまいます。
     無限に続くような再帰処理は、プログラミングの間違いでしょう。
    </span>
   </p></blockquote>
   </p>

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