<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'functions.user-defined.php',
    1 => 'Benutzerdefinierte Funktionen',
    2 => 'Benutzerdefinierte Funktionen',
  ),
  'up' => 
  array (
    0 => 'language.functions.php',
    1 => 'Funktionen',
  ),
  'prev' => 
  array (
    0 => 'language.functions.php',
    1 => 'Funktionen',
  ),
  'next' => 
  array (
    0 => 'functions.arguments.php',
    1 => 'Funktionsparameter und -argumente',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Benutzerdefinierte Funktionen</h2>
   <p class="para">
    Eine Funktion wird definiert mit dem Schlüsselwort
    <code class="literal">function</code>, einem Namen, einer Liste von Parametern (die
    auch leer sein können), die durch Kommata (<code class="literal">,</code>) getrennt
    und in Klammern eingeschlossen sind, gefolgt vom Funktionskörper, der in
    geschweiften Klammern eingeschlossen ist, wie im folgenden Beispiel:
   </p>
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Deklarieren einer neuen Funktion namens <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">"Beispielfunktion.\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">Hinweis</strong>: 
    <p class="para">
     Seit PHP 8.0.0 kann die Liste der Parameter ein Komma am Ende enthalten:
     <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">
    Innerhalb des Funktionskörpers kann jeder beliebige korrekte PHP-Code
    vorkommen, sogar andere Funktionen und
    <a href="language.oop5.basic.php#language.oop5.basic.class" class="link">Klassen</a>-Definitionen.
   </p>
   <p class="para">
    Für Funktionsnamen gelten in PHP die gleichen Regeln wie für andere
    Bezeichner. Ein gültiger Funktionsname beginnt mit einem Buchstaben oder
    Unterstrich gefolgt von einer beliebigen Anzahl von Buchstaben, Ziffern
    und Unterstrichen. Als regulärer Ausdruck wird dies so ausgedrückt:
    <code class="code">^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>.
   </p>
   <div class="tip"><strong class="tip">Tipp</strong><p class="simpara">Siehe auch <a href="userlandnaming.php" class="xref">Userland-Namensregeln</a>.</p></div>
   <p class="simpara">
    Es ist nicht erforderlich, dass Funktionen bereits definiert sein müssen,
    wenn auf sie verwiesen wird, <em>außer</em> wenn eine Funktion
    nur bedingt definiert wird, wie in den beiden untenstehenden Beispielen
    gezeigt.
   </p>
   <p class="para">
    Wenn eine Funktion nur unter bestimmten Bedingungen definiert wird, wie in
    den beiden folgenden Beispielen, muss die Definition dieser Funktion noch
    <em>vor</em> deren Aufruf abgearbeitet werden.
   </p>
   <p class="para">
    <div class="example" id="example-2">
     <p><strong>Beispiel #2 Bedingte Funktionen</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">/* Wir können foo() von hier aus nicht aufrufen, da sie<br />   noch nicht existiert, aber wir können bar() aufrufen */<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">"Ich existiere nicht, bis mich die Programmausführung erreicht hat.\n"</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* Nun können wir foo() sicher aufrufen,<br />   da $makefoo als true ausgewertet wurde */<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">"Ich existiere sofort nach Programmstart.\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>Beispiel #3 Funktionen innerhalb von Funktionen</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">"Ich existiere nicht, bis foo() aufgerufen wurde.\n"</span><span style="color: #007700">;<br />  }<br />}<br /><br /></span><span style="color: #FF8000">/* Wir können bar() noch nicht<br />   aufrufen, da es nicht existiert */<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">/* Nun können wir auch bar() aufrufen, da sie durch die<br />   Abarbeitung von foo() verfügbar gemacht wurde */<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">
    Alle Funktionen und Klassen in PHP existieren im globalen Namensraum -
    sie können außerhalb von Funktionen aufgerufen werden, selbst wenn sie
    innerhalb einer Funktion definiert wurden und umgekehrt.
   </p>
   <p class="simpara">
    PHP unterstützt weder das Überladen von Funktionen, noch ist es möglich,
    zuvor deklarierte Funktionen neu zu definieren oder die Definition zu
    löschen.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Groß- und Kleinschreibung spielt zwar bei Funktionsnamen keine Rolle für
     die ASCII-Zeichen <code class="literal">A</code> bis <code class="literal">Z</code>, es
     empfiehlt sich aber trotzdem, bei Funktionsaufrufen die gleiche
     Schreibweise wie in der Deklaration zu benutzen.
    </span>
   </p></blockquote>
   <p class="simpara">
    Sowohl
    <a href="functions.arguments.php#functions.variable-arg-list" class="link">eine variable Anzahl Parameter</a>
    als auch
    <a href="functions.arguments.php#functions.arguments.default" class="link">Vorgabewerte für Parameter</a>
    werden in Funktionen unterstützt. Siehe auch die Funktionsreferenzen für
    <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> und
    <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span> für weitere Informationen.
   </p>
   <p class="para">
    Es ist in PHP möglich, Funktionen rekursiv aufzurufen.
    <div class="example" id="example-4">
     <p><strong>Beispiel #4 Rekursive Funktionen</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">Hinweis</strong>: 
    <span class="simpara">
     Rekursive Funktions-/Methodenaufrufe mit einer Tiefe von über 100-200
     können zu einem Stacküberlauf und damit zum Programmabbruch führen.
     Insbesondere wird eine unbegrenzte Rekursion als Programmierfehler
     erachtet.
    </span>
   </p></blockquote>
   </p>
  </div><?php manual_footer($setup); ?>