PHP - définir une constante à l'intérieur d'une classe

88

Comment puis-je définir une constante à l'intérieur d'une classe et la rendre visible uniquement lorsqu'elle est appelée dans un contexte de classe?

....quelque chose comme Foo::app()->MYCONSTANT;

(et s'il est appelé comme MYCONSTANTpour être ignoré)

Alex
la source
3
J'ai eu ce problème récemment stackoverflow.com/q/5710676/560299
Ibu

Réponses:

140

Voir les 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

Dans ce cas , en écho MYCONSTANTpar lui - même soulèverait un avis au sujet d' une constante indéfinie et la sortie de la constante nom converti en une chaîne: "MYCONSTANT".


EDIT - Peut-être que vous recherchez ces propriétés / variables statiques :

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
la source
mais cela ne fonctionne pas de le définir à l'intérieur d'une fonction de la classe :(
Alex
@Alex: Non, ce n'est pas le cas (AFAIK, il y a peut-être un moyen obscur).
Alix Axel
3
(is_null(self::$staticVariable) === true) && (isset($value) === true)serait beaucoup plus succinct que self::$staticVariable === null && $value !== null. $valuesera toujours défini dans la fonction, donc pas besoin d'utiliser isset. Et l'hyper-explicite === truen'ajoute rien.
deceze
1
Avons-nous déjà eu cette conversation? Je ne peux pas m'en empêcher, je n'aime vraiment pas ce style. ;-D
deceze
@deceze: Oui. Je suis très habitué à ce style et ça marche pour moi donc je vais m'en tenir à ça, mais tu as raison aussi. =)
Alix Axel
24

C'est une vieille question, mais maintenant sur PHP 7.1, vous pouvez définir une visibilité constante.

EXEMPLE

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

Sortie de l'exemple ci-dessus en PHP 7.1:

bar

Erreur fatale: Erreur non interceptée: impossible d'accéder au const privé Foo :: BAZ dans…

Remarque: Depuis PHP 7.1.0, les modificateurs de visibilité sont autorisés pour les constantes de classe.

Plus d'infos ici

matiaslauriti
la source
11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

C'est la seule façon de créer des constantes de classe . Ces constantes sont toujours globalement accessibles via Foo::BAR, mais elles ne sont pas accessibles via juste BAR.

Pour obtenir une syntaxe comme celle-ci Foo::baz()->BAR, vous devez renvoyer un objet de la fonction baz()de classe Fooqui a une propriété BAR . Ce n'est pas une constante cependant. Toute constante que vous définissez est toujours accessible globalement de n'importe où et ne peut pas être limitée aux résultats des appels de fonction.

déceler
la source
6

C'est une question assez ancienne, mais peut-être que cette réponse peut encore aider quelqu'un d'autre.

Vous pouvez émuler une constante publique restreinte dans une portée de classe en appliquant le mot-clé final à une méthode qui renvoie une valeur prédéfinie, comme ceci:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

Le mot clé final sur une méthode empêche une classe étendue de redéfinir la méthode. Vous pouvez également placer le mot-clé final devant la déclaration de classe, auquel cas le mot-clé empêche l'héritage de classe.

Pour obtenir presque exactement ce qu'Alex recherchait, le code suivant peut être utilisé:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

La valeur constante émulée serait accessible comme ceci:

Foo::app()->MYCONSTANT();
Barrage de Wouter van
la source
3

Vous pouvez définir une constante de classe en php. Mais votre constante de classe serait également accessible à partir de n'importe quelle instance d'objet. C'est la fonctionnalité de php. Cependant, à partir de php7.1 , vous pouvez définir vos constantes de classe avec des modificateurs d'accès ( public, privateou protected).

Une solution serait de définir votre constante comme privateou protected, puis de la rendre lisible via un fichier static function. Cette fonction ne doit renvoyer les valeurs constantes que si elle est appelée à partir du contexte statique.

Vous pouvez également créer cette fonction statique dans votre classe parente et simplement hériter de cette classe parente sur toutes les autres classes pour en faire une fonctionnalité par défaut.

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

Pranav Rana
la source