可能的重复项:
具有数组结构到数组的字符串
我有一个静态类,它用作注册表,存储一些相关的设置变量。由于它是静态的,我无法在运行时添加/删除属性,因此,在该类中,我有一个通用对象(可以是数组)来存储这些属性。
这是代码
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 的情况下完成这项工作?我是否应该更改为单例模式类并将属性直接添加到父对象(某些信息是明智的,例如数据库密码)?
未经测试
$cursor = self::$setsObj;
foreach (explode('->', $key) as $prop) {
if (!is_object($cursor)) {
//exception?
}
if (!isset($cursor->$prop)) {
return null;
}
$cursor = $cursor->$prop;
}
return $cursor;
我知道
我的回答可能听起来很愚蠢,但这不会实现你想要做的事情吗?
Settings::Set('foo', (object) array('bar' => 10));
var_dump(Settings::get('foo')->bar);