Así como podemos definir propiedades que funcionan igual que variables, también podemos definir constantes dentro de nuestras clases. Vale aclarar que la diferencia de una propiedad (o variable) de una constante, es que la primera puede modificar su contenido, mientras que las constantes, como su nombre lo indica, tienen un valor constante, un valor que no puede modificarse.
Un ejemplo perfecto de una constante puede ser el valor de PI, que siempre será 3,14. En esta ocasión crearé una clase llamada Validador que tendrá un método que reciba la edad del visitante y devuelva true si es mayor de edad y false si es menor.
Para comprobar si es mayor o menor de edad debemos tener una edad como referencia que jamás cambiará su valor ni en la clase, ni en el objeto. En este caso será 18. Bueno ese valor lo guardaremos en una constante:
<?php
class Validador {
const MAYOR_DE_EDAD = 18;
public function __construct() {
//Constructor vacío.
}
public function comprobarAcceso($edad){
if($edad < self::MAYOR_DE_EDAD){
return false;
}else{
return true;
}
}
}
?>
Dentro de la clase creamos una constante con el valor 18. Comprobá que la constante se escribe con la palabra reservada const, luego el nombre de la variable igual al valor. Luego creamos un método que recibe un parámetro con una edad y verifica si es mayor de edad devolviendo true o false.
Sin embargo algo importante a tener en cuenta es que las constantes dentro de la clase no se llaman con $this->, sino con self. La palabra reservada self hacen referencia al nombre de la clase. Hacer self::MAYOR_DE_EDAD sería lo mismo que hacer Validador::MAYOR_DE_EDAD.
Probemos su funcionamiento:
<?php
require_once 'clases/Validador.php';
$edad = 26;
$validador = new Validador();
if($validador->comprobarAcceso($edad)){
echo 'Bienvenido al sitio';
}else{
echo 'Usted es menor de edad.';
}
?>
Ahora para recuperar el valor de la constante fuera de la clase haríamos esto:
<?php require_once 'clases/Validador.php'; echo Validador::MAYOR_DE_EDAD; ?>
Saludos!
Anterior: Php orientado a objetos, parte 4: Métodos getters y setters
Siguiente: Php orientado a objetos, parte 6: Herencia

quizá sea una pregunta abusrda pero no logro darme cuenta
cual es la diferencia entre hacer esto :
class validador{
const MAYOR_DE_EDAD = 18;
public function __construct(){
}
public function validar($edad)
{
if($edad > self::MAYOR_DE_EDAD)
{
echo «es mayor»;
}
else
{
echo «es menor «;
}
}
}
$obj = new validador();
$obj->validar(23);
a hacer esto:
class validador{
const MAYOR_DE_EDAD = 18;
public function __construct(){
}
public function validar($edad)
{
if($edad > self::MAYOR_DE_EDAD)
{
return true;
}
else
{
return false;
}
}
}
$edad = 13;
$obj = new validador();
if($obj->validar($edad)){
echo «es mayor «;
}
else{
echo «es menor»;
}
¿hay alguna diferencia?
Por cierto muy buen blog , felicitaciones.
Tommy, cómo te va.
Mirá no creo que sea una pregunta absurda, nadie nació sabiendo, y está bien que preguntes. Todos vamos aprendiendo todos los días cosas como programadores y todos tenemos dudas.
Por lo que veo vos tenés dos clases prácticamente iguales pero con un método que varía, en uno se imprime por pantalla un mensaje y en otro retorna un tipo de dato boolean (true o false)
Bien desde mi punto de vista, ambos métodos están bien, pero el del segundo ejemplo, el que devuelve true o false, es más flexible.
Osea, a lo que me refiero es que cuando vos creás una aplicación tenés que pensar que tanto las clases como los métodos deben tener la capacidad de ser reutilizables.
Supongamos que vos te quedás con tu primer método, el que imprime por pantalla «es mayor» o «es menor». Entonces tu jefe te dice: «Tommy, en esta parte de la aplicación el se loguea, y si es mayor de edad debe redireccionarlo a una página, y si es menor a otra; pero si el usuario es menor de edad e intenta ingresar a una página con contenido para adultos, entonces debería aparecer un mensaje indicándole que no puede ver dicho contenido» En este caso vos estará obligado a crear dos métodos, uno que lo redirija a una página o a otra, y otro que le muestre el mensaje correspondiente. Esto a la larga termina siendo una tarea repetitiva donde vos vas a tener muchísimos métodos con funcionalidades repetidas.
Si en cambio te quedás con el primer método, entonces no importa cuál sea la acción de tu página, vos tenés un método que te devuelve simplemente lo que necesitas, si es mayor o menor de edad el usuario, nada más, y dependiendo del valor que te devuelva harás una cosa u otra.
Además no es buena idea imprimir (con echo o print) mensajes dentro de los métodos, a menos que sea un caso muy especial. Siempre es preferible que los métodos retornen valores que se abstraigan de la lógica, valores como string, number, boolean, array, objetos, etc.
Bueno, espero haber respondido a tu pregunta, sino me decís lo que no entendiste y te explico.
Gracias por pasarte.
Saludos!
hola gracias por este tuto, lo estoy leyendo justo ahora!.
una consulta boba(ya que se encuentra en google, por vago);
cuando instancias la clase no es lo mismo poner directamente el argumento de la funcion validar asi?=
if ($validador->comprobarAcceso(24)) {
echo ‘Usted es mayor de edad’;
} else {
echo ‘Usted es menor de edad’;
}
o sea es lo mismo que usar una variable, fue por algun motivo en especial? saludos y sigo con esto(quiero llegar a pdo)
Sí y no, osea la idea de usar constantes, es que estás trabajando con un dato que se inicia con un valor y ese valor no va a cambiar nunca.
Si vos guardás ese dato en la variable, corres el riesgo que el mismo sea modificado accidentalmente, y si una variable (o un atributo de un objeto) guarda que el acceso es mayor de 24, y siempre va a tener ese valor, entonces mejor usar una constante.
Saludos!