2013-03-24 9 views
0

Создал класс для хранения значений конфигурации.Исключить ссылочную переменную

код моего класса Config:

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 использует формат многоточия:

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

Но им пытаются создать метод для удаления значений, для пример:

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

В методах get и set я использую ссылочные переменные, чтобы найти правильный элемент, но я не знаю, как удалить ссылочную переменную. Если я использую unset($ref), Config::$params не изменяется.

+1

не уверен, почему вы используете Здесь так много ссылок. –

+0

, если вы используете, например, Config :: get ("website.forum.postsperpage"), класс должен получить динамический self :: $ params ["website"] ["forum"] ["postperpage"]. Его единственный способ (я думаю) управлять динамически вложенными массивами. –

ответ

0

когда вы $ref = &$ref[$key]; тогда $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

Я пробовал с вашим кодом и не работает –

Смежные вопросы