PHP クラス定数取得

クラス定数ってstatic変数みたいに、インスタンス化しなくてもクラスから直でとれるんだ…。 どちらも::で呼び出すの一緒だなと思ってはいたけど。 定数はインスタンス化しないととれないものと思い込んでいた。

余談:静的メンバって呼び方基本とするなら、変数は静的変数、と呼ぶのが自然だけど、 static変数のがわかりやすいよね…静的メンバはstaticメンバっていったほうが直感的かもな

知らずに色々検証してしまった。

以下いらなくなっちゃったけど記録として…

<?php
class TestClass
{
  const A = 1;
  const B = 2;
  const C = 3;


  // * 定数の出力 
  // ひとつずつ
  public static function getConst($propName)
  {
    return constant("self::" . $propName);
  }
  // 配列取得
  private static $constants;
  public static function getConstants()
  {
    if (!static::$constants) {
      $reflectionClass = new ReflectionClass(__CLASS__);
      static::$constants = $reflectionClass->getConstants();
    }
    return static::$constants;
  }
}
var_dump(TestClass::getConstants());
var_dump(TestClass::getConst("A"));

// まあこれでいけたんだけど…
var_dump(TestClass::A);

おまけ

いまとなっては没だけど、最初はこういうのも考えていた。 この取得方法の場合、定数名が間違っていても返される値がNULLになるだけで何も起きないので、エラーを送出するように。

<?php
    function getConst($propName)
    {
      $const =  TestClass::getConstants();
      if (!$const[$propName]) throw new ErrorException('TestClassに"' . $propName . '"が存在しません。');
      return $const[$propName];
    }