web-dev-qa-db-ja.com

定数の名前を含む単純な変数を使用してクラス定数にアクセスする

私は自分のクラスの1つのクラス定数にアクセスしようとしています:

const MY_CONST = "value";

この定数の名前を保持する変数がある場合:

$myVar = "MY_CONST";

MY_CONSTの値に何らかの方法でアクセスできますか?

self::$myVar

静的プロパティのためであるため、明らかに動作しません。変数変数も機能しません。

53
Adam Arold

これを行うには、2つの方法があります: constant 関数を使用するか、 reflection を使用します。

定数関数

定数関数は、クラス定数と同様にdefineで宣言された定数で動作します:

class A
{
    const MY_CONST = 'myval';

    static function test()
    {
        $c = 'MY_CONST';
        return constant('self::'. $c);
    }
}

echo A::test(); // output: myval

リフレクションクラス

もう1つの、より面倒な方法は、リフレクションを使用することです。

$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval
122
webbiedave

そのための構文はありませんが、明示的なルックアップを使用できます。

print constant("classname::$myConst");

私はそれもself::

29
mario

MY_CONSTの値に何らかの方法でアクセスできますか?

self::MY_CONST

動的にアクセスしたい場合は、 reflection API ドキュメント

$myvar = 'MY_CONST';
$class = new ReflectionClass(self);
$const = $class->getConstant($myVar);

リフレクションAPIの利点は、すべての定数を一度に取得できることです(getConstants)。

使用したくないためにリフレクションAPIが嫌いな場合は、代わりにconstant関数(- Demo )を使用します。

$myvar = 'MY_CONST';    
class foo {const MY_CONST = 'bar';}    
define('self', 'foo');    
echo constant(self.'::'.$myvar);
3
hakre

やってみました

$myVar = MY_CONST or $myVar = $MY_CONST
1
shawrie

Reflectionの注意:ReflectionClassのコンストラクターは、パラメーターのクラスのフルパスを受け取る必要があります。つまり、コンストラクターのパラメーターとして文字列「A」を設定するだけでは機能しない場合があります。

この問題を回避するために、ReflectionClassを使用する場合、次のようにすると良いでしょう。

$classA = new A();
$name_classA = get_class($classA);
$ref = new ReflectionClass(get_class($name_classA));
$constName = 'MY_CONST';
echo $ref->getConstant($constName);

関数get_classは、コード内にいるときはいつでもクラスの完全なパスを提供します。完全なパスがないと、「クラスが見つかりません」PHPエラー。

0
Fabiano