<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.types.callable.php',
    1 => 'Callables',
    2 => 'Callables',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Les types',
  ),
  'prev' => 
  array (
    0 => 'language.types.resource.php',
    1 => 'Les ressources',
  ),
  'next' => 
  array (
    0 => 'language.types.mixed.php',
    1 => 'Mixed',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">
   Un callable est une référence à une fonction ou une méthode qui est
   passée à une autre fonction en tant qu&#039;argument.
   Les callables sont représentés avec la déclaration de type <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
 </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">
  Certaines fonctions acceptent des fonctions de rappel en tant que paramètre, par exemple
  <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>, ou
  <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">Création de callables</h3>

  <p class="simpara">
   Un callable est un type qui représente quelque chose qui peut être invoqué.
   Les callables peuvent être passés en tant qu&#039;arguments aux fonctions ou méthodes qui
   attendent un paramètre callback ou ils peuvent être invoqués directement.
   Le type <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> ne peut pas être utilisé comme déclaration de type pour les
   propriétés. À la place, utiliser une déclaration de type <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>.
  </p>

  <p class="simpara">
   Les callables peuvent être créés de plusieurs façons différentes :
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">Objet <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara">Une <a href="language.types.string.php" class="link">chaîne de caractères</a> contenant le nom d&#039;une fonction ou d&#039;une méthode</span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Un <a href="language.types.array.php" class="link">tableau</a> contenant le nom d&#039;une classe ou un <span class="type"><a href="language.types.object.php" class="type object">object</a></span>
     dans l&#039;index 0 et le nom de la méthode dans l&#039;index 1
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     Un <a href="language.types.object.php" class="link">objet</a> implémentant la méthode magique
     <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a>
    </span>
   </li>
  </ul>

  <p class="simpara">
   Un objet <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span> peut être créé en utilisant
   la syntaxe <a href="functions.anonymous.php" class="link">function anonyme</a>,
   la syntaxe <a href="functions.arrow.php" class="link">function fléchée</a>,
   la syntaxe <a href="functions.first_class_callable_syntax.php" class="link">callable de première
   classe</a>, ou la méthode <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span>.
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <span class="simpara">
    La syntaxe <a href="functions.first_class_callable_syntax.php" class="link">callable de première
    classe</a> est disponible uniquement à partir de PHP 8.1.0.
   </span>
  </p></blockquote>

  <div class="example" id="example-1">
   <p><strong>Exemple #1 
    Exemple de callback utilisant une <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">// Utilisant la syntaxe de fonction anonyme<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">// Utilisant la syntaxe callable de première classe<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">// Utilisant la syntaxe de fonction fléchée<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">// Utilisant la méthode 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">// Utilisant la closure comme callback pour<br />// doubler la taille de chaque élément dans notre range<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>Résultat de l&#039;exemple ci-dessus en PHP 8.1 :</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">
   Un callable peut également être une string contenant le nom d&#039;une fonction ou une méthode
   statique.
   N&#039;importe quelle fonction intégrée ou définie par l&#039;utilisateur peut être utilisée, à l&#039;exception des constructions de langage
   telles que : <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> ou
   <span class="function"><a href="function.unset.php" class="function">unset()</a></span>.
  </p>

  <p class="simpara">
   Les méthodes de classes statiques peuvent être utilisées sans instancier un
   <span class="type"><a href="language.types.object.php" class="type object">object</a></span> de cette classe en créant soit un tableau avec
   le nom de la classe à l&#039;index 0 et le nom de la méthode à l&#039;index 1, ou en utilisant
   la syntaxe spéciale avec l&#039;opérateur de résolution de portée
   <code class="literal">::</code>, comme dans <code class="literal">&#039;ClassName::methodName&#039;</code>.
  </p>

  <p class="simpara">
   Une méthode d&#039;un <span class="type"><a href="language.types.object.php" class="type object">object</a></span> instancié peut être un callable
   lorsqu&#039;elle est fournie sous forme de tableau avec le <span class="type"><a href="language.types.object.php" class="type object">object</a></span> à l&#039;index 0 et
   le nom de la méthode à l&#039;index 1.
  </p>

  <p class="simpara">
   La principale différence entre un objet <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span> et le
   type <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> est que l&#039;objet <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>
   est indépendant du scope et peut toujours être invoqué, alors qu&#039;un type callable peut
   être dépendant du scope et ne peut être invoqué directement.
   <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span> est la méthode préférée pour créer des callables.
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <span class="simpara">
    Tandis que les objets <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span> sont liés au scope
    où ils sont créés, les callables référençant des méthodes de classes sous forme
    de chaînes de caractères ou de tableaux sont résolus dans le scope où ils sont appelés.
    Pour créer un callable à partir d&#039;une méthode privée ou protégée, qui peut ensuite être
    invoqué depuis l&#039;extérieur de la classe, utiliser
    <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span> ou la 
    <a href="functions.first_class_callable_syntax.php" class="link">syntaxe callable de
    première classe</a>
   </span>
  </p></blockquote>

  <p class="simpara">
   PHP permet la création de callables qui peuvent être utilisés en tant qu&#039;argument
   de callback mais qui ne peuvent pas être appelés directement.
   Il s&#039;agit de callables dépendants du contexte qui référencent une méthode de classe
   dans la hiérarchie d&#039;héritage d&#039;une classe, par exemple
   <code class="literal">&#039;parent::method&#039;</code> ou <code class="literal">[&quot;static&quot;, &quot;method&quot;]</code>.
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <span class="simpara">
    À partir de PHP 8.2.0, les callables dépendants du contexte
    sont dépréciés. Il faut supprimer la dépendance au contexte en remplaçant
    <code class="literal">&#039;parent::method&#039;</code> par
    <code class="literal">parent::class . &#039;::method&#039;</code> ou en utilisant la
    <a href="functions.first_class_callable_syntax.php" class="link">syntaxe callable de
    première classe</a>.
   </span>
  </p></blockquote>

  <div class="example" id="example-2">
   <p><strong>Exemple #2 
    Appel de différents types de callables avec <span class="function"><strong>call_user_function()</strong></span>
   </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">// Un exemple de fonction de rappel<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">// Un exemple de méthode de rappel<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">// Type 1: Fonction de rappel simple<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">// Type 2: Appel de méthode de classe statique<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">// Type 3: Appel de méthode d'objet<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">// Type 4: Appel de méthode de classe statique<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">// Type 5: Appel de méthode de classe statique en utilisant le mot-clé ::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">// Type 6: Appel de méthode de classe statique relative<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">// obsolète à partir de PHP 8.2.0<br /><br />// Type 7: Les objets implémentant __invoke peuvent être utilisés en tant que callables<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>L&#039;exemple ci-dessus va afficher :</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">Note</strong>: <p class="para">
 Notez que les fonctions de rappel enregistrées avec des fonctions comme <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span> et
 <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span> ne seront pas appelées si une exception n&#039;est pas interceptée alors
 qu&#039;elle a été lancée dans une précédente fonction de rappel.
</p></p></blockquote>
 </div>

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