<?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.constants.php',
    1 => 'Constantes de classe',
    2 => 'Constantes de classe',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Les classes et les objets',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.property-hooks.php',
    1 => 'Hooks de propri&eacute;t&eacute;',
  ),
  'next' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Auto-chargement de classes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/oop5/constants.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.constants" class="sect1">
 <h2 class="title">Constantes de classe</h2>
 <p class="para">
  Il est possible de définir des <a href="language.constants.php" class="link">constantes</a>
  par classes qui restent identiques et non modifiables.
  La visibilité par défaut des constantes de classe est <code class="literal">public</code>.
 </p>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
   Les constantes de classes peuvent être redéfinies par une classe enfant.
   À partir de PHP 8.1.0, les constantes de classes ne peuvent pas être
   redéfinies par une classe enfant si elle a été définie comme
   <a href="language.oop5.final.php" class="link">finale</a>.
  </p>
 </p></blockquote>
 <p class="para">
  Il est aussi possible pour les interfaces d&#039;avoir des constantes.
  Voir la <a href="language.oop5.interfaces.php" class="link">documentation des interfaces</a>
  pour des exemples.
 </p>
 <p class="para">
  Il est possible de référencer la classe en utilisant une variable.
  La valeur de la variable ne peut pas être un mot-clé (e.g. <code class="literal">self</code>,
  <code class="literal">parent</code> et <code class="literal">static</code>).
 </p>
 <p class="para">
  Il est à noter que les constantes de classe sont allouées une fois par classe, et non
  pour chaque instance de classe.
 </p>
 <p class="para">
  À partir de PHP 8.3.0, les constantes de classe peuvent avoir un type scalaire tel que
  <code class="literal">bool</code>, <code class="literal">int</code>, <code class="literal">float</code>, <code class="literal">string</code>,
  ou même <code class="literal">array</code>. Lorsqu’on utilise <code class="literal">array</code>, son contenu
  ne peut contenir que d&#039;autres types scalaires.
 </p>

 <div class="example" id="example-1">
  <p><strong>Exemple #1 Définition et utilisation d&#039;une constante 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">class </span><span style="color: #0000BB">MyClass<br /></span><span style="color: #007700">{<br />    const </span><span style="color: #0000BB">CONSTANT </span><span style="color: #007700">= </span><span style="color: #DD0000">'valeur constante'</span><span style="color: #007700">;<br /><br />    function </span><span style="color: #0000BB">showConstant</span><span style="color: #007700">() {<br />        echo  </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">CONSTANT </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />echo </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">CONSTANT </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$classname </span><span style="color: #007700">= </span><span style="color: #DD0000">"MyClass"</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$classname</span><span style="color: #007700">::</span><span style="color: #0000BB">CONSTANT </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$class </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$class</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">showConstant</span><span style="color: #007700">();<br /><br />echo </span><span style="color: #0000BB">$class</span><span style="color: #007700">::</span><span style="color: #0000BB">CONSTANT</span><span style="color: #007700">.</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>
 <p class="para">
  La constante spéciale <strong><code>::class</code></strong> permet
  une résolution de nom de classe pleinement qualifié au moment de la compilation,
  cela est utile pour les classes dans un espace de noms :
 </p>
 <div class="example" id="example-2">
  <p><strong>Exemple #2 Exemple d&#039;utilisation de ::class</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">foo </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">bar </span><span style="color: #007700">{<br />    }<br /><br />    echo </span><span style="color: #0000BB">bar</span><span style="color: #007700">::class; </span><span style="color: #FF8000">// foo\bar<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <div class="example" id="example-3">
  <p><strong>Exemple #3 Exemple d&#039;expressions pour une constante 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">const </span><span style="color: #0000BB">ONE </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />class </span><span style="color: #0000BB">foo </span><span style="color: #007700">{<br />    const </span><span style="color: #0000BB">TWO </span><span style="color: #007700">= </span><span style="color: #0000BB">ONE </span><span style="color: #007700">* </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    const </span><span style="color: #0000BB">THREE </span><span style="color: #007700">= </span><span style="color: #0000BB">ONE </span><span style="color: #007700">+ </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">TWO</span><span style="color: #007700">;<br />    const </span><span style="color: #0000BB">SENTENCE </span><span style="color: #007700">= </span><span style="color: #DD0000">'The value of THREE is '</span><span style="color: #007700">.</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">THREE</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <div class="example" id="example-4">
  <p><strong>Exemple #4 Modificateur de visibilité des constantes de classe, à partir de PHP 7.1.0</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 </span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">BAR </span><span style="color: #007700">= </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">;<br />    private const </span><span style="color: #0000BB">BAZ </span><span style="color: #007700">= </span><span style="color: #DD0000">'baz'</span><span style="color: #007700">;<br />}<br />echo </span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">BAR</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">Foo</span><span style="color: #007700">::</span><span style="color: #0000BB">BAZ</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 en PHP 7.1 :</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bar

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
</pre></div>
   </div>
 </div>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
   À partir de PHP 7.1.0, les modificateurs de visibilité sont autorisés
   sur les constantes de classe.
  </p>
 </p></blockquote>
 <div class="example" id="example-5">
  <p><strong>Exemple #5 Vérification de variance de visibilité des constantes de classe, à partir de PHP 8.3.0</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">interface </span><span style="color: #0000BB">MyInterface<br /></span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">VALUE </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">implements </span><span style="color: #0000BB">MyInterface<br /></span><span style="color: #007700">{<br />    protected const </span><span style="color: #0000BB">VALUE </span><span style="color: #007700">= </span><span style="color: #0000BB">42</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.3 :</p></div>
  <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
</pre></div>
  </div>
 </div>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <span class="simpara">
   À partir de PHP 8.3.0, la variance de visibilité est vérifiée de manière plus stricte.
   Avant cette version, la visibilité d&#039;une constante de classe pouvait différer de celle de la constante
   dans l&#039;interface implémentée.
  </span>
 </p></blockquote>
 <div class="example" id="example-6">
  <p><strong>Exemple #6 Syntaxe d&#039;accès dynamique aux constantes de classe, à partir de PHP 8.3.0</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 </span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">BAR </span><span style="color: #007700">= </span><span style="color: #DD0000">'bar'</span><span style="color: #007700">;<br />    private const </span><span style="color: #0000BB">BAZ </span><span style="color: #007700">= </span><span style="color: #DD0000">'baz'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #DD0000">'BAR'</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">Foo</span><span style="color: #007700">::{</span><span style="color: #0000BB">$name</span><span style="color: #007700">}, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">// bar<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
   À partir de PHP 8.3.0, les constantes de classe peuvent être récupérées dynamiquement en utilisant une
   variable.
  </p>
 </p></blockquote>
 <div class="example" id="example-7">
  <p><strong>Exemple #7 Attribution de types aux constantes de classe, à partir de PHP 8.3.0</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">MyClass </span><span style="color: #007700">{<br />    public const </span><span style="color: #0000BB">bool MY_BOOL </span><span style="color: #007700">= </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />    public const </span><span style="color: #0000BB">int MY_INT </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />    public const </span><span style="color: #0000BB">float MY_FLOAT </span><span style="color: #007700">= </span><span style="color: #0000BB">1.01</span><span style="color: #007700">;<br />    public const </span><span style="color: #0000BB">string MY_STRING </span><span style="color: #007700">= </span><span style="color: #DD0000">'one'</span><span style="color: #007700">;<br />    public const array </span><span style="color: #0000BB">MY_ARRAY </span><span style="color: #007700">= [</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_BOOL</span><span style="color: #007700">, </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_INT</span><span style="color: #007700">, </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_FLOAT</span><span style="color: #007700">, </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_STRING</span><span style="color: #007700">];<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_BOOL</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_INT</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_FLOAT</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_STRING</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">MyClass</span><span style="color: #007700">::</span><span style="color: #0000BB">MY_ARRAY</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 8.3 :</p></div>
  <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(true)
int(1)
float(1.01)
string(3) &quot;one&quot;
array(4) {
  [0]=&gt;
  bool(true)
  [1]=&gt;
  int(1)
  [2]=&gt;
  float(1.01)
  [3]=&gt;
  string(3) &quot;one&quot;
}
   </pre></div>
  </div>
 </div>
</div><?php manual_footer($setup); ?>