php访问self :: VAR动态

时间:2018-04-05 08:42:46

标签: php

我想通过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
        }
    }

2 个答案:

答案 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);
?>

Live Demo

输出

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;");
    }

Live Demo

答案 1 :(得分:0)

self::U_1尝试访问类常量U_1self::$id尝试访问类(静态)属性$id

您可以将U_1U_2合并为一个数组(以U_1U_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");
    }
 }