¿Puedes usar constantes estáticas dentro de las clases en PHP?

3 minutos de lectura

avatar de usuario
Emanuil Rusev

Esperaba que lo siguiente funcionara, pero no parece funcionar.

<?php

class Patterns
{
    public static const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix";
    public static const INT = "/^\d+$/";
    public static const USERNAME = "/^\w+$/";
}

Porque arroja este error:

syntax error, unexpected T_CONST, expecting T_VARIABLE

avatar de usuario
naveed

Puedes usar const en clase así:

class Patterns {
    const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix";
    const INT = "/^\d+$/";
    const USERNAME = "/^\w+$/";
}

y puede acceder USERNAME constante así:

Patterns::USERNAME

  • Cuando es una constante, creo que el compilador de PHP debe manejarlo como estático internamente, ya que su valor no se puede cambiar.

    – Albahaca Musa

    19 de diciembre de 2015 a las 14:34

  • pero valores de static variables se puede cambiar por la forma en que estos se manejan como static porque no se pueden cambiar implícitamente, pero pueden cambiar si depende de una variable global y el global variable cambios antes de la instance de class es creado

    – Ravinder Payal

    16 mayo 2016 a las 13:58

  • ¿Este método no crearía copias de las constantes para cada nueva instancia o me equivoco? ¿Es posible crear constantes de clase que se refieran a una sola referencia estática o simplemente no es posible en php?

    – cjsimon

    11 de mayo de 2018 a las 0:01

  • Desde el manual: “Tenga en cuenta que las constantes de clase se asignan una vez por clase, y no para cada instancia de clase”.

    – cjsimon

    18 de junio de 2018 a las 17:05


En PHP, static y const son dos cosas diferentes.

const denota una constante de clase. Son diferentes a las variables normales ya que no tienen el ‘$’ delante de ellas y no pueden tener ningún modificador de visibilidad (público, protegido, privado) delante de ellas. Su sintaxis:

class Test
{
    const INT = "/^\d+$/";
}

Porque son constantes, son inmutables.

Estático denota datos que se comparten entre objetos de la misma clase. estos datos pueden ser modificado. Un ejemplo sería una clase que realiza un seguimiento de cuántas instancias están en juego en un momento dado:

class HowMany
{
    private static $count = 0;

    public function __construct()
    {
        self::$count++;
    }

    public function getCount()
    {
        return self::$count;
    }

    public function __destruct()
    {
        self::$count--;
    }
}

$obj1 = new HowMany();
$obj2 = new HowMany();

echo $obj1->getCount();

unset($obj2);

echo $obj1->getCount();

No son constantes estáticas, solo constantes

class Patterns 
{ 
    const EMAIL = "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix"; 
    const INT = "/^\d+$/"; 
    const USERNAME = "/^\w+$/"; 
} 

echo Patterns::EMAIL;

No, las constantes de clase no se pueden etiquetar como estáticas ni se les puede asignar visibilidad.

http://php.net/manual/en/language.oop5.static.php

No es necesario declararlos estáticos o públicos. Echa un vistazo a los ejemplos en el manual:

http://www.php.net/manual/en/language.oop5.constants.php

avatar de usuario
cris

¿Cómo estás tratando de acceder a las constantes?

Creo que esto funcionaría:

patrones de eco::$CORREO ELECTRÓNICO;  //muestra "/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-...."

If you just declare it as static.

¿Ha sido útil esta solución?