PHP - define constante dentro de uma classe

88

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 MYCONSTANTde ser ignorado)

Alex
fonte
3
Tive esse problema recentemente stackoverflow.com/q/5710676/560299
Ibu

Respostas:

141

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 MYCONSTANTpor 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"
Alix Axel
fonte
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

<?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

matiaslauriti
fonte
11
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 Fooque 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.

deceze
fonte
6

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();
Wouter van Dam
fonte
3

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.

Créditos: http://dwellupper.io/post/48/defining-class-constants-in-php

Pranav Rana
fonte