2012-05-12 55 views
1

可能重複:
String with array structure to Array其他選項「EVAL」訪問多維數組時,對象內

我有工作作爲註冊一個靜態類,存儲一些相關設置變量。 由於它是靜態的,我不能在運行時添加/刪除屬性,所以在該類中我有一個通用對象(可以是數組),它存儲這些屬性。

這裏的代碼

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? 我可以更改爲單例模式類並直接向父對象添加屬性(某些信息是合理的,比如數據庫密碼)?

回答

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; 
0

我知道我的答案可能聽起來很傻,但不會達到這個你正在嘗試做什麼? :

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

var_dump(Settings::get('foo')->bar);