<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.oop5.constants.php',
    1 => 'Constantes de clase',
    2 => 'Constantes de clase',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Clases y objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.property-hooks.php',
    1 => 'Hooks de propiedad',
  ),
  'next' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Autocarga de clases',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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 clase</h2>
 <p class="para">
  Es posible definir <a href="language.constants.php" class="link">constantes</a>
  por clases que permanecen idénticas y no modificables.
  La visibilidad por omisión de las constantes de clase es <code class="literal">public</code>.
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Las constantes de clases pueden ser redefinidas por una clase hija.
   A partir de PHP 8.1.0, las constantes de clases no pueden ser
   redefinidas por una clase hija si ha sido definida como
   <a href="language.oop5.final.php" class="link">final</a>.
  </p>
 </p></blockquote>
 <p class="para">
  También es posible para las interfaces tener constantes.
  Ver la <a href="language.oop5.interfaces.php" class="link">documentación de las interfaces</a>
  para ejemplos.
 </p>
 <p class="para">
  Es posible referenciar la clase utilizando una variable.
  El valor de la variable no puede ser una palabra clave (por ejemplo, <code class="literal">self</code>,
  <code class="literal">parent</code> y <code class="literal">static</code>).
 </p>
 <p class="para">
  Tenga en cuenta que las constantes de clase son asignadas una vez por clase, y no
  para cada instancia de clase.
 </p>
 <p class="para">
  A partir de PHP 8.3.0, las constantes de clase pueden tener un tipo escalar como
  <code class="literal">bool</code>, <code class="literal">int</code>, <code class="literal">float</code>, <code class="literal">string</code>,
  o incluso <code class="literal">array</code>. Al utilizar <code class="literal">array</code>, su contenido
  solo puede contener otros tipos escalares.
 </p>

 <div class="example" id="example-1">
  <p><strong>Ejemplo #1 Definición y uso de una constante de clase</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">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">'valor 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 especial <strong><code>::class</code></strong> permite
  una resolución de nombre de clase completamente cualificado en el momento de la compilación,
  esto es útil para las clases en un espacio de nombres:
 </p>
 <div class="example" id="example-2">
  <p><strong>Ejemplo #2 Ejemplo de uso de ::class</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">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>Ejemplo #3 Ejemplo de expresiones para una constante de clase</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">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">'El valor de THREE es '</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>Ejemplo #4 Modificador de visibilidad de las constantes de clase, a partir de PHP 7.1</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">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>Resultado del ejemplo anterior en PHP 7.1:</p></div>
  <div class="example-contents screen">
<div class="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">Nota</strong>: 
  <p class="para">
   A partir de PHP 7.1.0, los modificadores de visibilidad son permitidos
   en las constantes de clase.
  </p>
 </p></blockquote>
 <div class="example" id="example-5">
  <p><strong>Ejemplo #5 Verificación de varianza de visibilidad de las constantes de clase, a partir de PHP 8.3.0</strong></p>
  <div class="example-contents">
<div class="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>Resultado del ejemplo anterior en PHP 8.3:</p></div>
  <div class="example-contents screen">
<div class="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">Nota</strong>: 
  <span class="simpara">
   A partir de PHP 8.3.0, la varianza de visibilidad es verificada de manera más estricta.
   Antes de esta versión, la visibilidad de una constante de clase podía diferir de la de la constante
   en la interfaz implementada.
  </span>
 </p></blockquote>
 <div class="example" id="example-6">
  <p><strong>Ejemplo #6 Sintaxis de acceso dinámico a las constantes de clase, a partir de PHP 8.3.0</strong></p>
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">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">Nota</strong>: 
  <p class="para">
   A partir de PHP 8.3.0, las constantes de clase pueden ser recuperadas dinámicamente utilizando una
   variable.
  </p>
 </p></blockquote>
 <div class="example" id="example-7">
    <p><strong>Ejemplo #7 Asignación de tipos a las constantes de clase, a partir de PHP 8.3.0</strong></p>
    <div class="example-contents">
<div class="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>Resultado del ejemplo anterior en PHP 8.3:</p></div>
    <div class="example-contents screen">
<div class="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); ?>