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 に答える