Constantes em Classes
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 16 de 91.
Às vezes, você precisa de valores em uma classe que nunca devem mudar. As constantes de classe fornecem uma maneira de definir valores fixos que permanecem os mesmos em todas as instâncias e não podem ser modificados após a declaração.
Você define uma constante usando a palavra-chave const dentro de uma classe. Por convenção, os nomes das constantes são escritos em letras maiúsculas:
<?php
class Circle {
const PI = 3.14159;
public $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return self::PI * $this->radius * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->area();
Saída:
78.53975Assim como as propriedades estáticas, as constantes pertencem à classe e não aos objetos individuais. Você as acessa usando self::CONSTANT_NAME dentro da classe ou ClassName::CONSTANT_NAME fora dela:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK . "\n";
echo HttpStatus::NOT_FOUND;
Saída:
200
404Ponto Chave: Ao contrário das propriedades estáticas, as constantes não podem ser alteradas depois de definidas. Elas são ideais para valores que devem permanecer fixos em toda a sua aplicação, como valores de configuração, códigos de status ou constantes matemáticas.
Desafio
FácilVamos construir um utilitário de conversão de temperatura que utiliza constantes de classe para armazenar valores de conversão fixos que nunca mudam.
Você criará dois arquivos para organizar seu código:
Temperature.php— Defina uma classeTemperatureque lida com conversões de temperatura. A classe deve ter três constantes:FREEZING_POINT_Cdefinida como0,BOILING_POINT_Cdefinida como100, eCONVERSION_FACTORdefinida como1.8(usada para a conversão de Celsius para Fahrenheit). Inclua uma propriedadepublic $celsiuse um construtor que aceite e defina o valor em Celsius. Adicione um métodotoFahrenheit()que converte a temperatura Celsius armazenada para Fahrenheit usando a fórmula:(celsius * CONVERSION_FACTOR) + 32. Adicione também um métodogetStatus()que retorna"Freezing"se a temperatura for igual à constante do ponto de congelamento,"Boiling"se for igual à constante do ponto de ebulição, ou"Normal"caso contrário.main.php— Inclua o arquivo da classe Temperature. Crie três objetos Temperature com os valores0,100, e25. Para cada temperatura, imprima a conversão para Fahrenheit seguida pelo status na mesma linha neste formato:"[fahrenheit]F - [status]". Cada temperatura deve estar em sua própria linha. Após imprimir as três, acesse a constanteBOILING_POINT_Cdiretamente da classe (usandoTemperature::BOILING_POINT_C) e imprima-a em uma nova linha.
Lembre-se de que as constantes são acessadas usando self::CONSTANT_NAME dentro da classe e ClassName::CONSTANT_NAME fora dela. Diferente das propriedades, as constantes não usam o símbolo $ ao serem acessadas.
Folha de consulta
Constantes de classe são valores fixos que nunca mudam e são compartilhados entre todas as instâncias de uma classe. Defina-as usando a palavra-chave const:
<?php
class Circle {
const PI = 3.14159;
public function area($radius) {
return self::PI * $radius * $radius;
}
}
Acesse constantes usando self::CONSTANT_NAME dentro da classe:
return self::PI * $radius * $radius;
Acesse constantes usando ClassName::CONSTANT_NAME fora da classe:
echo Circle::PI;
Principais diferenças em relação às propriedades estáticas:
- Constantes não podem ser alteradas após a declaração
- Constantes não usam o símbolo
$ - Constantes são ideais para valores fixos, como configurações, códigos de status ou constantes matemáticas
Por convenção, os nomes das constantes são escritos em letras maiúsculas:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK; // 200
Experimente você mesmo
<?php
require_once 'Temperature.php';
// TODO: Criar três objetos Temperature com os valores 0, 100 e 25
// TODO: Para cada temperatura, imprimir no formato: "[fahrenheit]F - [status]"
// Cada temperatura em sua própria linha
// TODO: Acessar e imprimir a constante BOILING_POINT_C diretamente da classe
// Use a sintaxe ClassName::CONSTANT_NAME
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy