我想通过self访问一个类属性,但是使用动态方法名称:
而不是
self::U_1;
我需要类似的东西:
$id = 'U_1';
self::$id;
示例:
class Dimensions extends Enum
{
const U_1 = [
'xxx' => 'A'
];
const U_2 = [
'xxx' => 'B'
];
static function all() {
$oClass = new ReflectionClass(__CLASS__);
return $oClass->getConstants();
}
static function byId(string $id) {
return self::$id
}
}
答案 0 :(得分:1)
在顶层完成的常量编译,你试图动态地保持这个常数,这就是你遇到问题的原因,你可以将它改为静态变量来动态获取。
<?php
class Dimensions
{
public static $U_1 = [
'xxx' => 'A'
];
public static $U_2 = [
'xxx' => 'B'
];
static function all() {
$oClass = new ReflectionClass(__CLASS__);
return $oClass->getConstants();
}
static function byId(string $id) {
return self::${$id};
}
}
$obj = Dimensions::byId('U_1');
print_r($obj);
$obj = Dimensions::byId('U_2');
print_r($obj);
?>
输出
Array
(
[xxx] => A
)
Array
(
[xxx] => B
)
另一种方法 eval("return self::$id;");
............
const U_1 = [
'xxx' => 'A'
];
const U_2 = [
'xxx' => 'B'
];
.............
static function byId(string $id) {
return eval("return self::$id;");
}
答案 1 :(得分:0)
self::U_1
尝试访问类常量U_1
,self::$id
尝试访问类(静态)属性$id
。
您可以将U_1
和U_2
合并为一个数组(以U_1
和U_2
作为键)并使用$id
作为此数组中的键访问您需要的数据:
class Dimensions extends Enum
{
const U = [
'U_1' => [
'xxx' => 'A'
],
'U_2' => [
'xxx' => 'B'
],
];
static function byId(string $id) {
return self::U[$id];
}
}
或者您可以使用constant()
函数来访问名称存储在字符串中的常量:
class Dimensions extends Enum {
const U_1 = [
'xxx' => 'A'
];
const U_2 = [
'xxx' => 'B'
];
static function byId(string $id) {
return constant("self::$id");
}
}