簡體   English   中英

使用包含常量名稱的簡單變量訪問類常量

[英]Accessing a class constant using a simple variable which contains the name of the constant

我正在嘗試訪問我的一個類中的類常量:

const MY_CONST = "value";

如果我有一個變量,它像這樣保存這個常量的名稱:

$myVar = "MY_CONST";

我可以以某種方式訪問​​ MY_CONST 的值嗎?

self::$myVar

顯然不起作用,因為它用於靜態屬性。 可變變量也不起作用。

有兩種方法可以做到這一點:使用常量函數或使用反射

常數函數

常量函數與通過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

沒有相應的語法,但您可以使用顯式查找:

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

我相信它也適用於self::

我可以以某種方式訪問​​ MY_CONST 的值嗎?

self::MY_CONST

如果要動態訪問,可以使用反射 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);

你有沒有嘗試過

$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 錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM