classMyClass{
const MYCONSTANT = 'constant value';
functionshowConstant() {
echoself::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 MYCONSTANTpor si só iria levantar um aviso sobre uma constante indefinida e saída constante nome convertido para uma string: "MYCONSTANT".
mas não funciona para defini-lo dentro de uma função da classe :(
Alex
@Alex: Não, não (AFAIK, pode haver uma forma obscura).
Alix Axel
3
(is_null(self::$staticVariable) === true) && (isset($value) === true)seria muito mais sucinto como self::$staticVariable === null && $value !== null. $valuesempre será definido dentro da função, portanto, não há necessidade de usar isset. E o hiper-explícito === truenão acrescenta nada.
deceze
1
Já tivemos essa conversa antes? Não posso evitar, realmente não gosto desse estilo. ;-D
deceze
@deceze: Sim. Estou muito acostumada com esse estilo e funciona para mim, então vou ficar com ele, mas você também tem razão. =)
Alix Axel
24
Esta é uma velha questão, mas agora no PHP 7.1 você pode definir visibilidade constante.
EXEMPLO
<?phpclassFoo{
// As of PHP 7.1.0publicconst BAR = 'bar';
privateconst 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.
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 Fooque possui uma propriedadeBAR . 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:
classFoo{
// This is a private constantfinalpublic 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:
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, privateou protected).
Uma solução alternativa seria definir sua constante como privateou protectede 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.
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"
fonte
(is_null(self::$staticVariable) === true) && (isset($value) === true)
seria muito mais sucinto comoself::$staticVariable === null && $value !== null
.$value
sempre será definido dentro da função, portanto, não há necessidade de usarisset
. 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:
Mais informações aqui
fonte
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 apenasBAR
.Para obter uma sintaxe como
Foo::baz()->BAR
, você precisaria retornar um objeto da funçãobaz()
de classeFoo
que possui uma propriedadeBAR
. 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.fonte
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:
fonte
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
ouprotected
).Uma solução alternativa seria definir sua constante como
private
ouprotected
e torná-las legíveis por meio de umstatic 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
fonte