2013-03-24 173 views
0

我创建了一个类来存储配置值。未设置引用变量

我的配置类的代码:

class Config 
{ 
protected static $params = array(); 
protected static $instance; 

private function __construct(array $params=NULL){ 
    if(!empty($params)){ 
     self::$params = $params; 
    } 
} 

public static function init(array $params=NULL){ 
    if(!isset(self::$instance)) 
     self::$instance = new Config($params); 
} 

public static function getInstance(){ 
    return self::$instance; 
} 

public static function initialized(){ 
    return isset(self::$instance); 
} 


public static function get($name) 
{ 
    $ref = &self::$params; 
    $keys = explode('.', $name); 
    foreach ($keys as $idx => $key): 
     if (!is_array($ref) || !array_key_exists($key, $ref)) 
      return NULL; 
     $ref = &$ref[$key]; 
    endforeach; 
    return $ref;   
} 

public function delete($name){ 
    $ref = &self::$params; 
    $keys = explode('.', $name); 
    foreach ($keys as $idx => $key): 
     if (!is_array($ref) || !array_key_exists($key, $ref)) 
      return NULL; 
     $ref = &$ref[$key]; 
    endforeach; 

    unset($ref);   
} 

public function set($name, $value) { 

    $ref = &self::$params; 
    $keys = explode('.', $name); 
    foreach ($keys as $idx => $key) { 
     if (!is_array($ref)) { 
      return false; 
      throw new Exception('key "'.implode('.', array_slice($keys, 0, $idx)).'" is not an array but '.gettype($ref)); 
     } 
     if (!array_key_exists($key, $ref)) { 
      $ref[$key] = array(); 
     } 
     $ref = &$ref[$key]; 
     } 


    $ref = $value; 
    return true; 
} 

public function getAll(){ 
    return self::$params; 
} 

public function clear(){ 
    self::$params = array(); 
} 

}

配置方法采用的是点阵格式:

Config::set("test.item","testdrive"); //store in class, array["test"]["item"]="testdrive" 

但是,即时通讯试图建立一个方法来删除值,例如:

Config::delete("test.item"); 

在get和set方法中,我使用引用变量来查找正确的项目,但我不知道如何删除引用的变量。如果我使用unset($ref),则Config::$params不受影响。

+1

不知道为什么你正在使用这里引用如此之多。 – 2013-03-24 17:21:54

+0

如果你使用例如Config :: get(“website.forum.postsperpage”),该类需要获得dinamically self :: $ params [“website”] [“forum”] [“postperpage”]。它是管理嵌套数组的唯一方式(我认为)。 – 2013-03-24 17:25:39

回答

0

当你$ref = &$ref[$key];然后$ref将持有(未REF)的$ref[$key],所以更好地应用unset()$ref[$key]这将取消设置它的参考,像这样:

public function delete($name){ 
    $ref = &self::$params; 
    $keys = explode('.', $name); 
    foreach ($keys as $idx => $key): 
     if (!is_array($ref) || !array_key_exists($key, $ref)) 
      return NULL; 
    endforeach; 

    unset($ref[$key]);   
} 
+0

我试着用你的代码,并没有奏效 – 2013-03-24 17:30:45