web-dev-qa-db-fra.com

Les constantes privées sont-elles possibles en PHP?

PHP ne permet pas

class Foo
{
    private const my_private_const;

mais bien sûr permet

const my_const;

Donc en fait les constantes sont globales car je peux accéder à my_const n'importe où en utilisant Foo::my_const

Existe-t-il un moyen de créer des constantes privées?

59
user656925

La réponse est un simple "non". PHP ne prend pas en charge ce concept. Le mieux que vous puissiez faire est un private static variable dans la classe, ce qui n'est pas aussi bon bien sûr car ce n'est pas en lecture seule. Mais il vous suffit de contourner cela.

Modifier

Votre question m'a fait réfléchir - voici quelque chose que je n'ai jamais essayé, mais qui pourrait fonctionner. Autrement dit, "cela n'a pas été testé". Mais supposons que vous vouliez une "constante privée" appelée FOO:

// "Constant" definitions
private function __get($constName){
    // Null for non-defined "constants"
    $val = null;

    switch($constName){
        case 'FOO':
            $val = 'MY CONSTANT UNCHANGEABLE VALUE';
            break;
        case 'BAR':
            $val = 'MY OTHER CONSTANT VALUE';
            break;
    }

    return $val;
}

Bien sûr, votre syntaxe serait un peu étrange:

// Retrieve the "constant"
$foo = $this->FOO;

... mais au moins cela ne fonctionnerait pas:

$this->FOO = 'illegal!';

Peut-être que quelque chose mérite d'être essayé?

À votre santé

40
Madbreaks

Gens! PHP 7.1.0 a été publié

Il est maintenant possible d'avoir des modificateurs de visibilité avec des constantes de classe.

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

Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
85
Tahir Yasin

Notez que des modificateurs de visibilité pour les constantes de classe ont été ajoutés dans PHP 7.1.

RFC: Visibilité constante de la classe de support

25
user1636505

Une version simplifiée de la solution de contournement de @Madbreaks: écrivez une fonction statique privée qui renvoie la valeur de votre "constante" privée:

private static function MY_CONSTANT() {
    return "constant string";
}

Usage:

public static function DoStuff() {
    echo self::MY_CONSTANT();
}
7
alexanderbird