web-dev-qa-db-fra.com

PHP - définit une constante dans une classe

Comment définir une constante dans une classe et la rendre visible uniquement lorsqu'elle est appelée dans un contexte de classe?

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

(et si appelé comme MYCONSTANT être ignoré)

76
Alex

Voir 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, l'écho de MYCONSTANT par lui-même soulèverait un avis concernant une constante non définie et produirait le nom constant converti en chaîne: "MYCONSTANT".


[~ # ~] edit [~ # ~] - Vous cherchez peut-être ceci 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"
119
Alix Axel

Ceci 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 dans PHP 7.1:

 bar 
 
 Erreur fatale: Erreur non capturée: Impossible d'accéder au propriétaire privé Foo :: BAZ dans… 

Remarque: À partir de PHP Des modificateurs de visibilité 7.1.0 sont autorisés pour les constantes de classe.

Plus d'infos ici

18
matiaslauriti
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

C'est la seule façon de faire constantes de classe. Ces constantes sont toujours accessibles globalement via Foo::BAR, Mais elles ne le sont pas uniquement via BAR.

Pour obtenir une syntaxe telle que Foo::baz()->BAR, vous devez renvoyer un objet à partir de la fonction baz() de la classe Foo ayant la propriété propriétéBAR. Ce n'est pas une constante cependant. Tout constant que vous définissez est toujours accessible de manière globale de n’importe où et ne peut pas être limité aux résultats d’appel de fonction.

10
deceze

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

Vous pouvez émuler une constante publique restreinte dans l'étendue d'une classe en appliquant le mot-clé final à une méthode renvoyant une valeur prédéfinie, comme ceci:

class Foo {

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

Le mot-clé final d'une méthode empêche une classe d'extension 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 la classe.

Pour obtenir presque exactement ce que Alex cherchait, 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();
6
Wouter van Dam

Vous pouvez définir une constante de classe en php. Mais votre constante de classe serait également accessible depuis 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, private ou protected).

Pour contourner ce problème, définissez votre constante sous la forme private ou protected, puis rendez-les lisibles via un 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 parent et hériter simplement de cette classe parent 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

3
Pranav Rana