【问题标题】:Accessing a class constant using a simple variable which contains the name of the constant使用包含常量名称的简单变量访问类常量
【发布时间】:2011-11-22 07:41:51
【问题描述】:

我正在尝试访问我的一个类中的类常量:

const MY_CONST = "value";

如果我有一个像这样保存这个常量名称的变量:

$myVar = "MY_CONST";

我能以某种方式访问​​ MY_CONST 的值吗?

self::$myVar

显然不起作用,因为它适用于静态属性。 变量变量也不起作用。

【问题讨论】:

    标签: php class variables constants


    【解决方案1】:

    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 错误。

    【讨论】:

      【解决方案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
      

      反射类

      第二种更费力的方法是通过反思:

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

      【讨论】:

      • 如果我有一个带有常量的 Trait 和一个实现该 Trait 的类,如何解决这个问题?
      【解决方案3】:

      你试过了吗

      $myVar = MY_CONST or $myVar = $MY_CONST
      

      【讨论】:

      • 我不知道我将访问哪个常量。常量的名称在运行时评估并放入 $myVar。所以这行不通。
      【解决方案4】:

      我能以某种方式访问​​ MY_CONST 的值吗?

      self::MY_CONST
      

      如果要动态访问,可以使用reflection API Docs

      $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);
      

      【讨论】:

      【解决方案5】:

      没有语法,但您可以使用显式查找:

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

      我相信它也适用于self::

      【讨论】:

      • 使用“print”让我困惑了一秒钟,因为这并不是真正的解决方案的一部分,但是是的,使用 constant() 函数似乎是最好的方法。
      • 如果类在不同的路径上,似乎有必要指定类命名空间。
      猜你喜欢
      • 2012-07-27
      • 2011-01-12
      • 1970-01-01
      • 2011-10-01
      • 2016-11-26
      • 2016-10-11
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多