Como posso definir uma constante dentro de uma classe e torná-la visível apenas quando chamada em um contexto de classe?
....algo como Foo::app()->MYCONSTANT;
(e se chamado gosta MYCONSTANT
de ser ignorado)
Respostas:
Veja constantes de classe :
class MyClass
{
const MYCONSTANT = 'constant value';
function showConstant() {
echo self::MYCONSTANT. "\n";
}
}
echo MyClass::MYCONSTANT. "\n";
$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0
Neste caso ecoando MYCONSTANT
por si só iria levantar um aviso sobre uma constante indefinida e saída constante nome convertido para uma string: "MYCONSTANT"
.
EDITAR - Talvez o que você esteja procurando sejam propriedades / variáveis estáticas :
class MyClass
{
private static $staticVariable = null;
public static function showStaticVariable($value = null)
{
if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
{
self::$staticVariable = $value;
}
return self::$staticVariable;
}
}
MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"
(is_null(self::$staticVariable) === true) && (isset($value) === true)
seria muito mais sucinto como self::$staticVariable === null && $value !== null
. $value
sempre será definido dentro da função, portanto, não há necessidade de usar isset
. E o hiper-explícito === true
não acrescenta nada.
Esta é uma velha questão, mas agora no PHP 7.1 você pode definir visibilidade constante.
EXEMPLO
<?php
class Foo {
// As of PHP 7.1.0
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>
Resultado do exemplo acima no PHP 7.1:
Barra Erro fatal: Erro não detectado: não é possível acessar const privado Foo :: BAZ em…
Nota: A partir do PHP 7.1.0, modificadores de visibilidade são permitidos para constantes de classe.
Mais informações aqui
class Foo {
const BAR = 'baz';
}
echo Foo::BAR;
Esta é a única maneira de fazer constantes de classe . Essas constantes estão sempre acessíveis globalmente via Foo::BAR
, mas não são acessíveis via apenas BAR
.
Para obter uma sintaxe como Foo::baz()->BAR
, você precisaria retornar um objeto da função baz()
de classe Foo
que possui uma propriedade BAR
. Isso não é uma constante. Qualquer constante que você definir estará sempre acessível globalmente de qualquer lugar e não pode ser restrita aos resultados da chamada de função.
Esta é uma pergunta muito antiga, mas talvez esta resposta ainda possa ajudar outra pessoa.
Você pode emular uma constante pública que é restrita dentro de um escopo de classe, aplicando a palavra-chave final a um método que retorna um valor predefinido, como este:
class Foo {
// This is a private constant
final public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
A palavra-chave final em um método impede que uma classe de extensão redefina o método. Você também pode colocar a palavra-chave final na frente da declaração da classe, caso em que a palavra-chave impede a herança da classe.
Para obter quase exatamente o que Alex estava procurando, o seguinte código pode ser usado:
final class Constants {
public MYCONSTANT()
{
return 'MYCONSTANT_VALUE';
}
}
class Foo {
static public app()
{
return new Constants();
}
}
O valor da constante emulada seria acessível assim:
Foo::app()->MYCONSTANT();
Você pode definir uma constante de classe em php. Mas sua constante de classe também seria acessível a partir de qualquer instância de objeto. Esta é a funcionalidade do php. No entanto, a partir de php7.1 , você pode definir suas constantes de classe com modificadores de acesso ( public
, private
ou protected
).
Uma solução alternativa seria definir sua constante como private
ou protected
e torná-las legíveis por meio de um static function
. Esta função só deve retornar os valores constantes se chamada a partir do contexto estático.
Você também pode criar essa função estática em sua classe pai e simplesmente herdar essa classe pai em todas as outras classes para torná-la uma funcionalidade padrão.
Créditos: http://dwellupper.io/post/48/defining-class-constants-in-php