web-dev-qa-db-ja.com

PHPで動的に選択されたクラス定数の値を取得

私はこのようなことをしたいと思います:

class ThingIDs
{
    const Something = 1;
    const AnotherThing = 2;
}

$thing = 'Something';
$id = ThingIDs::$thing;

これは機能しません。同等のことをする簡単な方法はありますか?クラスにこだわっていることに注意してください。それは私が書き直すことができないライブラリにあります。私はコマンドラインで引数を取るコードを書いています、そして、私は本当にがID番号の代わりにシンボリック名を取るようにしたいと思います。

103
Ben

$id = constant("ThingIDs::$thing");

http://php.net/manual/en/function.constant.php

171
Dan Simon

リフレクションを使用する

$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);
25
Phil

名前空間を使用している場合は、クラスに名前空間を含める必要があります。

echo constant('My\Application\ThingClass::ThingConstant'); 
11
Jordi Kroon
<?php

class Dude {
    const TEST = 'howdy';
}

function symbol_to_value($symbol, $class){
    $refl = new ReflectionClass($class);
    $enum = $refl->getConstants();
    return isset($enum[$symbol])?$enum[$symbol]:false;
}

// print 'howdy'
echo symbol_to_value('TEST', 'Dude');
3
Josh

ヘルパー機能

次のような関数を使用できます。

function class_constant($class, $constant)
{
    if ( ! is_string($class)) {
        $class = get_class($class);
    }

    return constant($class . '::' . $constant);
}

次の2つの引数が必要です。

  • クラス名またはオブジェクトインスタンス
  • クラス定数名

オブジェクトインスタンスが渡されると、そのクラス名が推測されます。 PHP 7を使用している場合は、::class名前空間を考慮することなく適切なクラス名を渡します。

class MyClass
{
    const MY_CONSTANT = 'value';
}

class_constant('MyClass', 'MY_CONSTANT'); # 'value'
class_constant(MyClass::class, 'MY_CONSTANT'); # 'value' (PHP 7 only)

$myInstance = new MyClass;
class_constant($myInstance, 'MY_CONSTANT'); # 'value'
2
Glutexo

クラス自体への参照がある場合は、次を実行できます。

if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
   // class constant is defined
}
0
crmpicco