Constantes y constantes predefinidas

PHP permite definir constantes e incluye una serie de constante predefinidas que se pueden utilizar directamente:

Constantes

Las constantes son elementos de PHP que guardan un valor fijo que no se puede modificar a lo largo del programa. Las constantes pueden ser definidas por el programa o estar predefinidas por el propio PHP o por algún módulo. Los nombres de las constantes siguen las mismas reglas que los nombres de las variables, pero sin el dólar ($) inicial. La costumbre es escribir los nombres de las constantes en mayúsculas.

En principio, se puede no utilizar constantes nunca, puesto que las constantes definidas por el programa podrían reemplazarse por variables. La ventaja de usar constantes y variables es que se puede distinguir a simple vista si a lo largo de un programa algo va a permanecer constante (si es una constante) o puede cambiar (si es una variable). El inconveniente de usar constantes es que las constantes no se sustituyen dentro de las cadenas y es necesario sacarlas fuera de las cadenas, haciendo el código un poco más incómodo de escribir y leer. Desde el punto de vista del rendimiento, la diferencia es inapreciable.

Definir constantes

La función define(nombre_constante, valor_constante) permite definir constantes.

<?php
define("PI", 3.14);
print "<p>El valor de pi es " . PI . "</p>\n";
?>
<p>El valor de pi es 3.14</p>
<?php
define("AUTOR", "Bartolomé Sintes Marco");
print "<p>Autor: " . AUTOR . "</p>\n";
?>
<p>Autor: Bartolomé Sintes Marco</p>

La costumbre es escribir los nombres de las constantes en mayúsculas. Los nombres de las constantes deben empezar por una letra y tener sólo letras (acentos, etc), números y guiones bajos.


Las constantes no se sustituyen dentro de una cadena por lo que es necesario sacarlas para mostrar su valor.

<?php
define("PI", 3.14);
print "<p>El valor de pi es PI</p>\n";
print "<p>El valor de pi es " . PI . "</p>\n";
?>
<p>El valor de pi es PI</p>
<p>El valor de pi es 3.14</p>

En las constantes, PHP distingue entre minúsculas y mayúsculas:

<?php
define("PI", 3.14);
define("pi", 3.141592);
print "<p>El valor de pi es " . PI . "</p>";
print "<p>El valor de pi es " . pi . "</p>";
?>
<p>El valor de pi es 3.14</p>
<p>El valor de pi es 3.141592</p>

Constantes predefinidas

Tanto PHP como los módulos cargados definen automáticamente una serie de constantes predefinidas, de las que se comentan algunas en esta lección:

Lista completa de constantes predefinidas

El número de constantes predefinidas depende de los módulos cargados en php.ini. La función get_defined_constants() devuelve las constantes predefinidas en el servidor que estemos utilizando:

<?php
print "<pre>";
print_r(get_defined_constants());
print "</pre>\n";
?>
<pre>Array
(
    [E_ERROR] => 1
    [E_RECOVERABLE_ERROR] => 4096
    [E_WARNING] => 2
    [E_PARSE] => 4
    [E_NOTICE] => 8
    [E_STRICT] => 2048
    ...
)
</pre>

INF

La constante INF representa el infinito, es decir, cualquier número demasiado grande (positivo o negativo) para poderse guardar en una variable decimal.

PHP_INT_MAX

PHP_INT_MAX es el valor del mayor entero que se puede guardar en una variable de tipo entero.

<?php
$maximo = PHP_INT_MAX;
print "<p>El mayor entero que se puede guardar \n";
print "en una variable entera es $maximo</p>\n";
?>
<p>El mayor entero que se puede guardar
en una variable entera es 2147483647</p>

Ese valor depende del tamaño en bytes que ocupan las variables en la memoria, que depende del microprocesador, del sistema operativo y de la versión de PHP. En sistemas de 32 bits, los enteros suelen ocupar 4 bytes (32 bits). Como en una variable de tipo entero se guardan tanto valores positivos como negativos (utilizando la notación complemento a dos para los negativos), el valor máximo suele ser 2.147.483.647 (231 - 1). En sistemas de 64 bits, los enteros suelen ocupar 8 bytes (64 bits) y el valor máximo suele ser 9.223.372.036.854.775.807 (263 - 1)

Nota: En las versiones de PHP de 64 bits para Windows anteriores a PHP 7, los enteros tenían 4 bytes de tamaño. A partir de PHP 7, en las versiones de PHP de 64 bits para Windows los enteros tiene un tamaño de 8 bytes.


Notación complemento a dos

En un byte (8 bits) se pueden almacenar 256 (28) valores diferentes. Eso permite almacenar por ejemplo, desde el valor 0 hasta el 255. Para almacenar tanto números negativos como positivos, se utiliza la notación complemento a dos, en la que la primera mitad de los valores representan los valores positivos (desde 0 hasta 127) y la segunda mitad de los valores representan los valores negativos (desde -128 hasta -1), como indica la tabla siguiente:

El valor ... 0 1 2 3 4 5 ... 126 127 128 129 ... 253 254 255
... representa el entero ... 0 1 2 3 4 5 ... 126 127 -128 -127 .. -3 -2 -1

En cuatro bytes (32 bits) se pueden almacenar 4.294.967.296 (232)valores distintos. En notación complemento a dos se pueden representar desde el valor -2.147.483.648 hasta 2.147.483.647.

Si se intenta guardar un número demasiado grande positivo, el resultado será seguramente incorrecto. En el ejemplo siguiente se fuerza a PHP a guardar como entero el valor siguiente al máximo valor posible. El valor se guarda, pero cuando se utiliza, PHP lo interpreta como negativo.

<?php
$maximo = PHP_INT_MAX;
print "<p>El mayor entero que se puede guardar \n";
print "en una variable entera es $maximo<p>\n";
$demasiado = (int)($maximo + 1);
print "<p>Si se intenta guardar 1 más, \n";
print "el resultado es $demasiado</p>\n";
?>
<p>El mayor entero que se puede guardar
en una variable entera es 2147483647</p>
<p>Si se intenta guardar 1 más,
el resultado es -2147483648</p>

PHP_INT_SIZE

PHP_INT_SIZE es el tamaño en bytes de las variables de tipo entero, que depende del ordenador, del sistema operativo y de la versión de PHP. En sistemas de 32 bits suele ser 4 bytes y en sistema de 64 bits suele ser 8 bytes.

<?php
$tamano = PHP_INT_SIZE;
print "<p>Los enteros se guardan utilizando $tamano bytes</p>";
?>
<p>Los enteros se guardan utilizando 4 bytes</p>

Nota: En las versiones de PHP de 64 bits para Windows anteriores a PHP 7, los enteros tenían 4 bytes de tamaño. A partir de PHP 7, en las versiones de PHP de 64 bits para Windows los enteros tiene un tamaño de 8 bytes.