1

可能重复:
具有数组结构的字符串到数组

我有一个静态类,它用作注册表,存储一些相关的设置变量。由于它是静态的,我无法在运行时添加/删除属性,因此,在该类中,我有一个通用对象(可以是数组)来存储这些属性。

这是代码

class Settings
{
    private static $setsObj;
    public static function Set($key, $value)
    {
        self::$setsObj->$key = $value;
    }
    public static function Get($key)
    {
        if (strpos($key, '->') > 0)
        {
            $key = explode('->', $key);

            $n = count($key);

            $execute = 'return self::$setsObj->' . $key[0];

            for ($i = 1; $i < $n; $i++)
            {
                    $execute .= '["' . $key[$i] . '"]';
            }

            $execute .= ';';

            eval($execute);
        }
        else
        {
            return self::$setsObj->$key;
        }

    }
}

现在,这使我能够获得这样的确定属性:

Settings::Get('property_name');

如果该属性是一个数组,我可以像这样访问一个数组子项:

Setting::Get('property_name->subitem');

我的问题是:

在这种情况下使用 eval 正确吗?不使用 eval 是否可以完成这项工作?我是否应该更改为单例模式类并将属性直接添加到父对象(某些信息是明智的,例如 DB 密码)?

4

2 回答 2

0

未经测试

$cursor = self::$setsObj;
foreach (explode('->', $key) as $prop) {
    if (!is_object($cursor)) {
        //exception?
    }
    if (!isset($cursor->$prop)) {
        return null;
    }
    $cursor = $cursor->$prop;
}
return $cursor;
于 2012-05-12T23:36:36.543 回答
0

我知道我的回答可能听起来很傻,但这不会达到你想要做的吗?:

Settings::Set('foo', (object) array('bar' => 10));

var_dump(Settings::get('foo')->bar);
于 2012-05-12T23:40:40.313 回答