web-dev-qa-db-ja.com

PHPでプライベート定数は可能ですか?

PHPは許可しません

class Foo
{
    private const my_private_const;

しかし、もちろんできます

const my_const;

したがって、my_constを使用してどこでもFoo::my_constにアクセスできるため、実質的に定数はグローバルです。

プライベート定数を作成する方法はありますか?

59
user656925

答えは単純な「いいえ」です。 PHPはこの概念をサポートしていません。できることはprivate static変数。クラスは読み取り専用ではないため、もちろんあまり良くありません。しかし、あなたはそれを回避する必要があります。

編集

あなたの質問は私に考えさせられました-これは私が試したことがないが、うまくいくかもしれないものです。別の言い方をすれば、「これはテストされていません」。ただし、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;
}

もちろん、構文は少し奇妙に見えます:

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

...しかし、少なくともこれは動作しません:

$this->FOO = 'illegal!';

たぶん試してみる価値はありますか?

乾杯

40
Madbreaks

皆さん! PHP 7.1.0がリリースされました

クラス定数を持つ可視性修飾子を使用できるようになりました。

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

上記の例の出力PHP 7.1:

bar

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

クラス定数の可視性修飾子がPHP 7.1。

RFC: クラスの定数可視性のサポート

25
user1636505

@Madbreaksの回避策の簡易バージョン:プライベート「定数」の値を返すプライベート静的関数を作成します。

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

使用法:

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