私は自分のクラスの1つのクラス定数にアクセスしようとしています:
const MY_CONST = "value";
この定数の名前を保持する変数がある場合:
$myVar = "MY_CONST";
MY_CONSTの値に何らかの方法でアクセスできますか?
self::$myVar
静的プロパティのためであるため、明らかに動作しません。変数変数も機能しません。
これを行うには、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
そのための構文はありませんが、明示的なルックアップを使用できます。
print constant("classname::$myConst");
私はそれもself::
。
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);
やってみました
$myVar = MY_CONST or $myVar = $MY_CONST
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エラー。