<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.types.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.types.callable.php',
    1 => 'Callables',
    2 => 'Callables',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Typen',
  ),
  'prev' => 
  array (
    0 => 'language.types.resource.php',
    1 => 'Ressourcen',
  ),
  'next' => 
  array (
    0 => 'language.types.mixed.php',
    1 => 'Mixed',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'language/types/callable.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.types.callable" class="sect1">
 <h2 class="title">Callables</h2>

 <p class="simpara">
  Ein Callable ist eine Referenz auf eine Funktion oder Methode, die einer
  anderen Funktion als Argument übergeben wird.
  Sie werden durch die Typdeklaration <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> repräsentiert.
 </p>
 <div class="informalexample">
  <div class="example-contents">
<div class="annotation-non-interactive 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">(callable </span><span style="color: #0000BB">$callback</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$callback</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <p class="simpara">
  Einige Funktionen akzeptieren Callback-Funktionen als Parameter, zum
  Beispiel <span class="function"><a href="function.array-map.php" class="function">array_map()</a></span>, <span class="function"><a href="function.usort.php" class="function">usort()</a></span> oder
  <span class="function"><a href="function.preg-replace-callback.php" class="function">preg_replace_callback()</a></span>.
 </p>

 <div class="sect2" id="language.types.callable.passing">
  <h3 class="title">Erstellung von Callables</h3>

  <p class="simpara">
   Ein Callable ist ein Typ, der etwas repräsentiert, das aufgerufen werden
   kann. Callables können als Argumente an Funktionen oder Methoden übergeben
   werden, die einen Callback-Parameter erwarten, oder sie können direkt
   aufgerufen werden. Der Typ <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> kann nicht als
   Typdeklaration für Klasseneigenschaften verwendet werden. Verwenden Sie
   stattdessen eine <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Typdeklaration.
  </p>

  <p class="simpara">
   Callables können auf verschiedene Arten erstellt werden:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Objekt</span>
   </li>
   <li class="listitem">
    <span class="simpara">Ein <a href="language.types.string.php" class="link">String</a>, der den Namen einer Funktion oder Methode enthält</span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Ein <a href="language.types.array.php" class="link">Array</a>, das einen Klassennamen oder ein <span class="type"><a href="language.types.object.php" class="type Object">Object</a></span> an
     Index 0 und den Methodennamen an Index 1 enthält
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Ein <a href="language.types.object.php" class="link">Objekt</a>, das die magische Methode
     <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a> implementiert
    </span>
   </li>
  </ul>

  <p class="simpara">
   Ein <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Objekt kann mit der Syntax für
   <a href="functions.anonymous.php" class="link">anonyme Funktionen</a>, der Syntax
   für <a href="functions.arrow.php" class="link">Pfeilfunktionen</a>, der
   <a href="functions.first_class_callable_syntax.php" class="link">Syntax für
   Callbacks als Objekte erster Klasse</a> oder mit der Methode
   <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span> erstellt werden.
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <span class="simpara">
    Die <a href="functions.first_class_callable_syntax.php" class="link">Syntax für
    Callbacks als Objekte erster Klasse</a> ist erst ab PHP 8.1.0
    verfügbar.
   </span>
  </p></blockquote>

  <div class="example" id="example-1">
   <p><strong>Beispiel #1 
    Callback-Beispiel mit einem <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>
   </strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Verwendung der Syntax für anonyme Funktionen<br /></span><span style="color: #0000BB">$double1 </span><span style="color: #007700">= function (</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />};<br /><br /></span><span style="color: #FF8000">// Verwendung der Syntax für Callbacks als Objekte erster Klasse<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">double_function</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br />    return </span><span style="color: #0000BB">$a </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$double2 </span><span style="color: #007700">= </span><span style="color: #0000BB">double_function</span><span style="color: #007700">(...);<br /><br /></span><span style="color: #FF8000">// Verwendung der Syntax für Pfeilfunktionen<br /></span><span style="color: #0000BB">$double3 </span><span style="color: #007700">= fn(</span><span style="color: #0000BB">$a</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$a </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Verwendung von Closure::fromCallable<br /></span><span style="color: #0000BB">$double4 </span><span style="color: #007700">= </span><span style="color: #0000BB">Closure</span><span style="color: #007700">::</span><span style="color: #0000BB">fromCallable</span><span style="color: #007700">(</span><span style="color: #DD0000">'double_function'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Hier wird das Closure als Callback verwendet, um<br />// die Größe jedes Elements unseres Bereichs zu verdoppeln<br /></span><span style="color: #0000BB">$new_numbers </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">$double1</span><span style="color: #007700">, </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">));<br />print </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">' '</span><span style="color: #007700">, </span><span style="color: #0000BB">$new_numbers</span><span style="color: #007700">) . </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$new_numbers </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">$double2</span><span style="color: #007700">, </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">));<br />print </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">' '</span><span style="color: #007700">, </span><span style="color: #0000BB">$new_numbers</span><span style="color: #007700">) . </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$new_numbers </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">$double3</span><span style="color: #007700">, </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">));<br />print </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">' '</span><span style="color: #007700">, </span><span style="color: #0000BB">$new_numbers</span><span style="color: #007700">) . </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$new_numbers </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">$double4</span><span style="color: #007700">, </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">));<br />print </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">' '</span><span style="color: #007700">, </span><span style="color: #0000BB">$new_numbers</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt mit PHP 8.1 folgende Ausgabe:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
2 4 6 8 10
2 4 6 8 10
2 4 6 8 10
2 4 6 8 10
</pre></div>
   </div>
  </div>

  <p class="simpara">
   Ein Callable kann auch ein String sein, der den Namen einer Funktion oder
   einer statischen Methode enthält. Jede eingebaute oder benutzerdefinierte
   Funktion kann verwendet werden, außer Sprachkonstrukten wie:
   <span class="function"><a href="function.array.php" class="function">array()</a></span>, <span class="function"><a href="function.echo.php" class="function">echo</a></span>,
   <span class="function"><a href="function.empty.php" class="function">empty()</a></span>, <span class="function"><a href="function.eval.php" class="function">eval()</a></span>,
   <span class="function"><a href="function.isset.php" class="function">isset()</a></span>,
   <span class="function"><a href="function.list.php" class="function">list()</a></span>, <span class="function"><a href="function.print.php" class="function">print</a></span> oder
   <span class="function"><a href="function.unset.php" class="function">unset()</a></span>.
  </p>

  <p class="simpara">
   Statische Klassenmethoden können verwendet werden, ohne dass ein
   <span class="type"><a href="language.types.object.php" class="type Object">Object</a></span> dieser Klasse instantiiert werden muss, indem entweder
   ein Array mit dem Klassennamen an Index 0 und dem Methodennamen an Index 1
   erstellt wird, oder indem die spezielle Syntax mit dem
   Bereichsauflösungsoperator <code class="literal">::</code> wie in
   <code class="literal">&#039;ClassName::methodName&#039;</code> verwendet wird.
  </p>

  <p class="simpara">
   Eine Methode eines instantiierten <span class="type"><a href="language.types.object.php" class="type Object">Object</a></span>s kann ein Callable
   sein, wenn sie als Array mit dem <span class="type"><a href="language.types.object.php" class="type Object">Object</a></span> an Index 0 und dem
   Methodennamen an Index 1 angegeben wird.
  </p>

  <p class="simpara">
   Der Hauptunterschied zwischen einem <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Objekt
   und dem Typ <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> besteht darin, dass ein
   <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Objekt unabhängig vom Geltungsbereich ist
   und immer aufgerufen werden kann, während ein Callable-Typ vom
   Geltungsbereich abhängig sein kann und möglicherweise nicht direkt aufgerufen
   werden kann. <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span> ist die bevorzugte Art,
   Callables zu erstellen.
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <span class="simpara">
    Während <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>-Objekte an den Geltungsbereich
    gebunden sind, in dem sie erstellt werden, werden Callables, die
    Klassenmethoden als Strings oder Arrays referenzieren, in dem
    Geltungsbereich aufgelöst, in dem sie aufgerufen werden. Um aus einer
    privaten oder geschützten Methode ein Callable zu erstellen, das dann
    von außerhalb des Geltungsbereichs der Klasse aufgerufen werden kann,
    verwenden Sie <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span> oder die
    <a href="functions.first_class_callable_syntax.php" class="link">Syntax für
    Callbacks als Objekte erster Klasse</a>.
   </span>
  </p></blockquote>

  <p class="simpara">
   PHP erlaubt die Erstellung von Callables, die als Callback-Argument
   verwendet, aber nicht direkt aufgerufen werden können. Dabei handelt es
   sich um kontextabhängige Callables, die eine Klassenmethode in der
   Vererbungshierarchie einer Klasse referenzieren, zum Beispiel
   <code class="literal">&#039;parent::method&#039;</code> oder
   <code class="literal">[&quot;static&quot;, &quot;method&quot;]</code>.
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <span class="simpara">
    Seit PHP 8.2.0 sind kontextabhängige Callables veraltet. Entfernen Sie
    die Kontextabhängigkeit, indem Sie
    <code class="literal">&#039;parent::method&#039;</code> durch
    <code class="literal">parent::class . &#039;::method&#039;</code> ersetzen, oder verwenden
    Sie die <a href="functions.first_class_callable_syntax.php" class="link">Syntax für
    Callbacks als Objekte erster Klasse</a>.
   </span>
  </p></blockquote>

  <div class="example" id="example-2">
   <p><strong>Beispiel #2 
    Verschiedene Arten von Callables mit
    <span class="function"><strong>call_user_function()</strong></span> aufrufen
   </strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Eine Beispiel-Callback-Funktion<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_callback_function</span><span style="color: #007700">() {<br />    echo </span><span style="color: #DD0000">'hello world!'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Eine Beispiel-Callback-Methode<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{<br />    static function </span><span style="color: #0000BB">myCallbackMethod</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'Hello World!'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Typ 1: Einfaches Callback<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">(</span><span style="color: #DD0000">'my_callback_function'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Typ 2: Statischer Methodenaufruf<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">([</span><span style="color: #DD0000">'MyClass'</span><span style="color: #007700">, </span><span style="color: #DD0000">'myCallbackMethod'</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">// Typ 3: Aufruf einer Objektmethode<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">([</span><span style="color: #0000BB">$obj</span><span style="color: #007700">, </span><span style="color: #DD0000">'myCallbackMethod'</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">// Typ 4: Statischer Methodenaufruf<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">(</span><span style="color: #DD0000">'MyClass::myCallbackMethod'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Typ 5: Statischer Methodenaufruf mit dem Schlüsselwort ::class<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">([</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::class, </span><span style="color: #DD0000">'myCallbackMethod'</span><span style="color: #007700">]);<br /><br /></span><span style="color: #FF8000">// Typ 6: Relativer statischer Methodenaufruf<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'A'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">who</span><span style="color: #007700">() {<br />        echo </span><span style="color: #DD0000">'B'</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">([</span><span style="color: #DD0000">'B'</span><span style="color: #007700">, </span><span style="color: #DD0000">'parent::who'</span><span style="color: #007700">]); </span><span style="color: #FF8000">// seit PHP 8.2.0 veraltet<br /><br />// Typ 7: Objekte die __invoke implementieren können als Callable verwendet werden<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__invoke</span><span style="color: #007700">(</span><span style="color: #0000BB">$name</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">'Hello '</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">C</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">call_user_func</span><span style="color: #007700">(</span><span style="color: #0000BB">$c</span><span style="color: #007700">, </span><span style="color: #DD0000">'PHP!'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
hello world!
Hello World!
Hello World!
Hello World!
Hello World!

Deprecated: Callables of the form [&quot;B&quot;, &quot;parent::who&quot;] are deprecated in script on line 41
A
Hello PHP!
</pre></div>
   </div>
  </div>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: <p class="para">Callbacks, die für
Funktionen wie <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span> und <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span> registriert
sind, werden nicht mehr ausgeführt, wenn in einem vorherigen Callback eine Exception geworfen und nicht gefangen
wurde.</p></p></blockquote>
 </div>

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