<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.oop5.basic.php',
    1 => 'Syntaxe de base',
    2 => 'Syntaxe de base',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Les classes et les objets',
  ),
  'prev' => 
  array (
    0 => 'oop5.intro.php',
    1 => 'Introduction',
  ),
  'next' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Propri&eacute;t&eacute;s',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/oop5/basic.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.basic" class="sect1">
  <h2 class="title">Syntaxe de base</h2>
  <div class="sect2" id="language.oop5.basic.class">
   <h3 class="title">class</h3>
   <p class="para">
    Une définition de classe basique commence par le mot-clé
    <code class="literal">class</code>, suivi du nom de la classe.
    Suit une paire d&#039;accolades contenant la définition des propriétés et des
    méthodes appartenant à la classe.
   </p>
   <p class="para">
    Le nom de la classe peut être quelconque à condition que ce ne soit pas un
    <a href="reserved.php" class="link">mot réservé</a> en PHP.
    À partir de PHP 8.4.0, l&#039;utilisation d&#039;un seul underscore <code class="literal">_</code> comme nom de classe est obsolète.
    Un nom de classe valide commence par une lettre ou un underscore,
    suivi de n&#039;importe quel nombre de lettres, chiffres ou underscores.
    En tant qu&#039;expression régulière, cela serait exprimé ainsi :
    <code class="code">^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>.
   </p>
   <p class="para">
    Une classe peut contenir ses propres <a href="language.oop5.constants.php" class="link">constantes</a>,
    <a href="language.oop5.properties.php" class="link">variables</a>
    (appelées &quot;propriétés&quot; ou &quot;attributs&quot;), et fonctions (appelées &quot;méthodes&quot;).
   </p>
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Définition typique d&#039;une classe</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: #007700">class </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// déclaration d'une propriété<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">$var </span><span style="color: #007700">= </span><span style="color: #DD0000">'une valeur par défaut'</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// déclaration des méthodes<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">() {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    La pseudo-variable <var class="varname">$this</var> est disponible
    lorsqu&#039;une méthode est appelée depuis un contexte objet.
    <var class="varname">$this</var> est la valeur de l&#039;objet appelant.
   </p>
   <div class="warning"><strong class="warning">Avertissement</strong>
    <p class="para">
     Appeler une méthode non-statique statiquement lance une
     <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
     Avant PHP 8.0.0, ceci générait une notice d&#039;obsolescence,
     et <var class="varname">$this</var> était indéfini.
    </p>
    <div class="example" id="language.oop5.basic.class.this">
     <p><strong>Exemple #2 Quelques exemples de la pseudo-variable <var class="varname">$this</var></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: #007700">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        if (isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">)) {<br />            echo </span><span style="color: #DD0000">'$this is defined ('</span><span style="color: #007700">;<br />            echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />            echo </span><span style="color: #DD0000">")\n"</span><span style="color: #007700">;<br />        } else {<br />            echo </span><span style="color: #DD0000">"\$this is not defined.\n"</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<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 7 :</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
$this is defined (A)

Deprecated: Non-static method A::foo() should not be called statically in %s on line 27
$this is not defined.

Deprecated: Non-static method A::foo() should not be called statically in %s on line 20
$this is not defined.

Deprecated: Non-static method B::bar() should not be called statically in %s on line 32

Deprecated: Non-static method A::foo() should not be called statically in %s on line 20
$this is not defined.
</pre></div>
     </div>
     <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus en PHP 8 :</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
$this is defined (A)

Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27
Stack trace:
#0 {main}
  thrown in %s on line 27
</pre></div>
     </div>
    </div>
   </div>

    <div class="sect3" id="language.oop5.basic.class.readonly">
      <h4 class="title">Classes en lecture seule (readonly)</h4>
      <p class="para">
        À partir de PHP 8.2.0, une classe peut être marquée
        avec le modificateur <span class="modifier">readonly</span>.
        Marquer une classe comme <span class="modifier">readonly</span> ajoutera
        le <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">modificateur <span class="modifier">readonly</span></a>
        à chaque propriété déclarée, et empêchera la création
        de <a href="language.oop5.properties.php#language.oop5.properties.dynamic-properties" class="link">propriétés dynamiques</a>.
        En outre, il est impossible d&#039;ajouter leur prise en charge en utilisant
        l&#039;attribut <span class="classname"><a href="class.allowdynamicproperties.php" class="classname">AllowDynamicProperties</a></span>.
        Toute tentative de le faire déclenchera une erreur de compilation.
      </p>
      <div class="informalexample">
        <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: #007700">#[</span><span style="color: #0000BB">\AllowDynamicProperties</span><span style="color: #007700">]<br />readonly class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #FF8000">// Erreur fatale : Cannot apply #[AllowDynamicProperties] to readonly class Foo<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>

      <p class="para">
        Comme ni les propriétés non typées ni les propriétés statiques
        ne peuvent être marquées avec le modificateur <code class="literal">readonly</code>,
        les classes readonly ne peuvent pas non plus les déclarer :
      </p>
      <div class="informalexample">
        <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: #007700">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Erreur fatale : Readonly property Foo::$bar must have type<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

        <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: #007700">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">int $bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Erreur fatale : Readonly class Foo cannot declare static properties<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>
      <p class="para">
        Une classe <span class="modifier">readonly</span> peut être
        <a href="language.oop5.basic.php#language.oop5.basic.extends" class="link">étendue</a> si,
        et seulement si, la classe enfant est également
        une classe <span class="modifier">readonly</span>.
      </p>
    </div>

  </div>

  <div class="sect2" id="language.oop5.basic.new">
   <h3 class="title">Le mot-clé <code class="literal">new</code></h3>
   <p class="para">
    Pour créer une instance d&#039;une classe, le mot-clé <code class="literal">new</code> doit être
    utilisé. Un objet sera alors systématiquement créé, à moins qu&#039;il ait un
    <a href="language.oop5.decon.php" class="link">constructeur</a>
    défini qui lance une <a href="language.exceptions.php" class="link">exception</a>
    en cas d&#039;erreur. Les classes devraient être définies avant l&#039;instanciation (dans
    certains cas, c&#039;est impératif).
   </p>
   <p class="para">
    Si une variable <span class="type"><a href="language.types.string.php" class="type string">string</a></span> contenant un nom de classe est utilisée avec
    <code class="literal">new</code>, une nouvelle instance de cette classe sera créée.
    Si la classe est dans un espace de noms, son nom pleinement qualifié doit être utilisé.
   </p>

   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     S&#039;il n&#039;y a pas d&#039;arguments à passer au constructeur de la classe,
     les parenthèses après le nom de la classe peuvent être omises.
    </p>
   </p></blockquote>
   
   <div class="example" id="example-2">
    <p><strong>Exemple #3 Création d&#039;une instance</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: #007700">class </span><span style="color: #0000BB">SimpleClass </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instance</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Ceci peut également être réalisé avec une variable :<br /></span><span style="color: #0000BB">$className </span><span style="color: #007700">= </span><span style="color: #DD0000">'SimpleClass'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">$className</span><span style="color: #007700">(); </span><span style="color: #FF8000">// new SimpleClass()<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instance</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="para">
    À partir de PHP 8.0.0, l&#039;utilisation de <code class="literal">new</code> avec des
    expressions arbitraires est supportée.
    Ceci permet des instantiations plus complexes si l&#039;expression produit une
    <span class="type"><a href="language.types.string.php" class="type string">string</a></span>. L&#039;expression doit être entourée de parenthèses.
   </p>
   <div class="example" id="example-3">
    <p><strong>Exemple #4 Créer une instance en utilisant une expression arbitraire</strong></p>
    <div class="example-contents"><p>
     Dans l&#039;exemple donné, nous montrons plusieurs exemples d&#039;expressions
     arbitraires valides qui produisent un nom de classe.
     Ceci montre un appel de fonction, une concaténation de chaînes
     et la constante <strong><code>::class</code></strong>.
    </p></div>
    <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: #007700">class </span><span style="color: #0000BB">ClassA </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassC </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassD </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassA </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">(): </span><span style="color: #0000BB">string<br /></span><span style="color: #007700">{<br />    return </span><span style="color: #DD0000">'ClassA'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'B'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'C'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">ClassD</span><span style="color: #007700">::class));<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 :</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
object(ClassA)#1 (0) {
}
object(ClassB)#1 (0) {
}
object(ClassC)#1 (0) {
}
object(ClassD)#1 (0) {
}

</pre></div>
    </div>
   </div>
   <p class="para">
    Dans le contexte de la classe, il est possible de créer un nouvel objet
    avec <code class="literal">new self</code> et <code class="literal">new parent</code>.
   </p>
   <p class="para">
    Lors de l&#039;assignation d&#039;une instance déjà créée d&#039;une classe à une variable,
    la nouvelle variable accédera à la même instance que l&#039;objet qui a été assigné.
    Ce comportement est le même lors du passage d&#039;une instance à une fonction.
    Une copie d&#039;un objet déjà créé peut être effectuée par
    <a href="language.oop5.cloning.php" class="link">clonage</a>.
   </p>
   <div class="example" id="example-4">
    <p><strong>Exemple #5 Assignation d&#039;un objet</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: #007700">class </span><span style="color: #0000BB">SimpleClass </span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">string $var</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$assigned   </span><span style="color: #007700">=  </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$reference  </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instance</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var </span><span style="color: #007700">= </span><span style="color: #DD0000">'$assigned aura cette valeur'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">; </span><span style="color: #FF8000">// $instance et $reference deviennent null<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instance</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$reference</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$assigned</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>
NULL
NULL
object(SimpleClass)#1 (1) {
   [&quot;var&quot;]=&gt;
     string(27) &quot;$assigned aura cette valeur&quot;
}
</pre></div>
    </div>
   </div>
   <p class="para">
    Il est possible de créer une instance d&#039;un objet de quelques manières différentes :
   </p>
   <div class="example" id="example-5">
    <p><strong>Exemple #6 Créer de nouveaux objets</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: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    public static function </span><span style="color: #0000BB">getNew</span><span style="color: #007700">()<br />    {<br />        return new static();<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Child </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Par le nom de la classe<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">$obj1</span><span style="color: #007700">(); </span><span style="color: #FF8000">// À travers la variable contenant un objet<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">!== </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Par la méthode de classe<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Test</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">= </span><span style="color: #0000BB">Child</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">(); </span><span style="color: #FF8000">// À travers une méthode de classe enfant<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Child</span><span style="color: #007700">);<br /><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>
bool(true)
bool(true)
bool(true)
</pre></div>
    </div>
   </div>

   <p class="para">
    Il est possible d&#039;accéder à un membre d&#039;un objet nouvellement
    créé en une seule expression :
   </p>
   <div class="example" id="example-6">
    <p><strong>Exemple #7 Accéder à un membre d&#039;un objet nouvellement créé</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: #007700">echo (new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">())-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y'</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// les parenthèses autour sont optionnelles à partir de PHP 8.4.0<br /></span><span style="color: #007700">echo new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y'</span><span style="color: #007700">), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<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 est similaire à :</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
2025
2025
</pre></div>
    </div>
   </div>

   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <span class="simpara">
     Avant PHP 7.1, les arguments ne sont pas évalués s&#039;il n&#039;y a pas de
     fonction constructeur définie.
    </span>
   </p></blockquote>
  </div>
  
  <div class="sect2" id="language.oop5.basic.properties-methods">
   <h3 class="title">Propriétés et méthodes</h3>
   <p class="para">
    Les propriétés et méthodes de classe vivent dans des &quot;espaces de noms&quot; séparés,
    donc il est possible d&#039;avoir une propriété et une méthode avec le même nom.
    Faire référence à la fois à une propriété ainsi qu&#039;une méthode ont la même
    notation, et le fait qu&#039;une propriété sera accédée ou qu&#039;une méthode sera appelée,
    dépend seulement du contexte, c&#039;est-à-dire si l&#039;utilisation est un accès variable
    ou un appel de fonction.
   </p>
   <div class="example" id="example-7">
    <p><strong>Exemple #8 Accès de propriété contre appel de méthode</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: #007700">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'property'</span><span style="color: #007700">;<br />    <br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() {<br />        return </span><span style="color: #DD0000">'method'</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">, </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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>
property
method
</pre></div>
    </div>
   </div>
   <p class="para">
    Ceci signifie qu&#039;appeler une <a href="functions.anonymous.php" class="link">fonction
    anonyme</a> qui a été assignée à une propriété n&#039;est pas possible directement.
    Au lieu de cela, la propriété doit d&#039;abord être affectée à une variable.
    Il est possible d&#039;appeler ce genre de propriété directement
    en la mettant entre parenthèses.
   </p>
   <div class="example" id="example-8">
    <p><strong>Exemple #9 Appeler une fonction anonyme enregistrée dans une propriété</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: #007700">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br />    <br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar </span><span style="color: #007700">= function() {<br />            return </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />        };<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /><br />echo (</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">)(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</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>
42
</pre></div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.extends">
   <h3 class="title">Le mot-clé <code class="literal">extends</code></h3>
   <p class="para">
    Une classe peut hériter des constantes, méthodes et des propriétés d&#039;une autre classe en
    utilisant le mot-clé <code class="literal">extends</code> dans la déclaration.
    Il n&#039;est pas possible d&#039;étendre plusieurs classes : une classe peut
    uniquement hériter d&#039;une seule classe de base.
   </p>
   <p class="para">
    Les constantes, méthodes et propriétés héritées peuvent être redéfinies en les redéclarant avec le
    même nom que dans la classe parente. Cependant, si la classe parente a défini
    une méthode ou constante comme <a href="language.oop5.final.php" class="link">final</a>,
    alors celles-ci ne peuvent pas être redéfinies. Il est possible d&#039;accéder aux
    méthodes ou propriétés statiques redéfinies en y faisant référence avec l&#039;opérateur
    <a href="language.oop5.paamayim-nekudotayim.php" class="link">parent::</a>.
   </p>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <span class="simpara">
     À partir de PHP 8.1.0, les constantes peuvent être déclarées comme finales.
    </span>
   </p></blockquote>
   <div class="example" id="example-9">
    <p><strong>Exemple #10 Héritage simple d&#039;une classe</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: #007700">class </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Classe parente\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">ExtendClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />  </span><span style="color: #FF8000">// Redéfinition de la méthode parente<br />  </span><span style="color: #007700">function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br />  {<br />    echo </span><span style="color: #DD0000">"Classe étendue\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br />  }<br />}<br /><br /></span><span style="color: #0000BB">$extended </span><span style="color: #007700">= new </span><span style="color: #0000BB">ExtendClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">displayVar</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>
Classe étendue
Classe parente
</pre></div>
    </div>
   </div>

   <div class="sect3" id="language.oop.lsp">
    <h4 class="title">Règles de compatibilité de signature</h4>
    <p class="para">
     Lors de la surcharge d&#039;une méthode, sa signature doit être compatible avec
     la méthode parente. Sinon, une erreur fatale est émise, ou, antérieur à
     PHP 8.0.0, une erreur de niveau <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> est générée.
     Une signature est compatible si elle respecte les règles de
     <a href="language.oop5.variance.php" class="link">variance</a>, rend un paramètre
     obligatoire optionnel, et seulement si tous les nouveaux paramètres sont
     optionnels et assouplissent les règles de visibilité.
     Ceci est connu sous le Principe de Substitution de Liskov
     (Liskov Substitution Principle), ou simplement LSP.
     Le <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">constructeur</a>,
     et les méthodes <code class="literal">private</code> sont exclus de ces règles de
     compatibilité des signatures, et par conséquent n&#039;émettront pas d&#039;erreur
     fatale en cas de signature incompatible.
    </p>
    <div class="example" id="example-10">
     <p><strong>Exemple #11 Méthodes enfant compatibles</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: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valid\n"</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">Extend1 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br />class </span><span style="color: #0000BB">Extend2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br /></span><span style="color: #0000BB">$extended1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend2</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</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>
Valid
Valid
</pre></div>
     </div>
    </div>

    <p class="para">
     Les exemples suivants démontrent qu&#039;une méthode enfant qui supprime un paramètre,
     ou rend un paramètre optionnel obligatoire, n&#039;est pas compatible avec la méthode parente.
    </p>
    <div class="example" id="example-11">
     <p><strong>Exemple #12 Erreur fatale quand une méthode enfant supprime un paramètre</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: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valid\n"</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">parent</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">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus en PHP 8 est similaire à :</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13
</pre></div>
     </div>
    </div>
    <div class="example" id="example-12">
     <p><strong>Exemple #13 Erreur fatale quand une méthode enfant rend un paramètre optionnel obligatoire</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: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valid\n"</span><span style="color: #007700">;<br />    }<br />}<br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus en PHP 8 est similaire à :</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13
</pre></div>
     </div>
    </div>

    <div class="warning"><strong class="warning">Avertissement</strong>
     <p class="para">
      Renommer un paramètre d&#039;une méthode dans une classe enfant n&#039;est pas
      une incompatibilité de signature. Cependant, ceci est déconseillé car cela
      résultera en une <span class="classname"><a href="class.error.php" class="classname">Error</a></span> à l&#039;exécution si les
      <a href="functions.arguments.php#functions.named-arguments" class="link">arguments nommés</a>
      sont utilisés.
     </p>
     <div class="example" id="example-13">
      <p><strong>Exemple #14 Erreur lors de l&#039;utilisation des arguments nommés et que les paramètres ont été renommés dans une classe enfant</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: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, </span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {}<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 function </span><span style="color: #0000BB">test</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 />}<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Passe les paramètres selon le contrat de A::test()<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">: </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #0000BB">bar</span><span style="color: #007700">: </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">); </span><span style="color: #FF8000">// ERREUR !</span></span></code></div>
      </div>

      <div class="example-contents"><p>Résultat de l&#039;exemple ci-dessus est similaire à :</p></div>
      <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
Stack trace:
#0 {main}
  thrown in /in/XaaeN on line 14
</pre></div>
      </div>
     </div>
    </div>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.class.class">
   <h3 class="title">::class</h3>

   <p class="para">
    Le mot-clé <code class="literal">class</code> est également utilisé
    pour la résolution des noms de classes.
    Il est possible d&#039;obtenir le nom pleinement qualifié d&#039;une classe
    <code class="literal">ClassName</code> en utilisant <code class="literal">ClassName::class</code>.
    C&#039;est particulièrement utile avec les classes utilisant des
    <a href="language.namespaces.php" class="link">espaces de noms</a>.
   </p>
   <p class="para">
    <div class="example" id="language.oop5.basic.class.class.name">
     <p><strong>Exemple #15 Résolution de nom de classe</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: #007700">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br />    <br />    echo </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">::class;<br />}<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>
NS\ClassName
</pre></div>
     </div>
    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     La résolution du nom de classe en utilisant <code class="literal">::class</code> est une
     transformation lors de la compilation. C&#039;est-à-dire qu&#039;à l&#039;instant où la chaîne du
     nom de classe est créée aucun autochargement n&#039;a encore eu lieu. Par conséquent,
     les noms de classes sont étendus même si la classe n&#039;existe pas. Aucune erreur
     n&#039;est émise dans ce cas-là.
    </p>
    <div class="example" id="language.oop5.basic.class.class.fail">
     <p><strong>Exemple #16 Résolution de nom de classe manquante</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: #007700">print </span><span style="color: #0000BB">Does\Not\Exist</span><span style="color: #007700">::class;<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>
Does\Not\Exist
</pre></div>
     </div>
    </div>
   </p></blockquote>
   <p class="para">
    À partir de PHP 8.0.0, <code class="literal">::class</code> peut être utilisé
    sur les objets. Cette résolution se produit lors de l&#039;exécution, et non lors de
    la compilation. Ses effets sont les mêmes que d&#039;appeler
    <span class="function"><a href="function.get-class.php" class="function">get_class()</a></span> sur l&#039;objet.
   </p>
   <div class="example" id="language.oop5.basic.class.class.object">
    <p><strong>Exemple #17 Résolution du nom d&#039;un objet</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: #007700">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br /><br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">();<br />    print </span><span style="color: #0000BB">$c</span><span style="color: #007700">::class;<br />}<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>
NS\ClassName
</pre></div>
    </div>
   </div>
  </div>
 <div class="sect2" id="language.oop5.basic.nullsafe">
  <h3 class="title">Méthodes et propriétés nullsafe</h3>
  <p class="para">
   À partir de PHP 8.0.0, les méthodes et propriétés peuvent aussi être accédées
   avec l&#039;opérateur &quot;nullsafe&quot; : <code class="literal">?-&gt;</code>. L&#039;opérateur nullsafe
   fonctionne à l&#039;identique que l&#039;accès de propriétés ou méthodes comme ci-dessus,
   à l&#039;exception que si l&#039;objet qui est déréférencé est <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> alors <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> sera
   retourné au lieu de lancer une exception. Si le déréférencement fait partie d&#039;une
   chaîne, le reste de la chaîne est ignoré.
  </p>
  <p class="para">
   L&#039;effet est similaire à entourer chaque accès par une vérification avec
   <span class="function"><a href="function.is-null.php" class="function">is_null()</a></span> d&#039;abord, mais plus compact.
  </p>
  <p class="para">
   <div class="example" id="example-14">
    <p><strong>Exemple #18 Opérateur nullsafe</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// À partir de PHP 8.0.0, cette ligne:<br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">?-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">)?-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Est équivalente au bloc de code suivant :<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$repository</span><span style="color: #007700">)) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br />    if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    L&#039;opérateur nullsafe est mieux utilisé quand null est considéré comme une valeur valide
    et potentiellement attendu pour une propriété ou valeur de retour d&#039;une méthode.
    Pour indiquer une erreur, lancer une exception est préférable.
   </p>
  </p></blockquote>
 </div>
 </div><?php manual_footer($setup); ?>