2015-12-07 2 views
0

У меня проблема. Я сделал одноэлементный класс конфигурации, но когда у меня есть более одной переменной, чтобы получить, она возвращает 1.Singleton config class возвращает 1

пример:

$config = Config::getInstance(); 

echo $config->get('database.host'); 

работает отлично, возвращает «локальный».

НО:

$config = Config::getInstance(); 

echo $config->get('database.host'); 
echo $config->get('database.user'); 
echo $config->get('database.pass'); 
echo $config->get('database.name'); 

возвращает "локальный", 1, 1, 1

Почему? Вот мой класс конфигурации:

<?php 

namespace System\Libraries; 

class Config 
{ 
    private static $_instance = null; 

    public function getInstance() 
    { 
     if (self::$_instance == null) { 
      self::$_instance = new Self; 
     } 

     return self::$_instance; 
    } 

    public function get($path) 
    { 
     if (isset($path)) { 
      $path = explode('.', $path); 
      $config = require_once 'system/config/config.php'; 

      foreach ($path as $key) { 
       if (isset($config[$key])) { 
        $config = $config[$key]; 
       } 
      } 

      return $config; 
     } 
    } 

    private function __clone() {} 
    private function __wakeup() {} 
    private function __construct() {} 

    public function __destruct() 
    { 
     self::$_instance = null; 
    } 
} 

?> 

ответ

0

Ожидаемое поведение. require_once вернет true, если файл был ранее. Это поведение относится ко всем функциям * _once в PHP, например. include_once. Echoing true показывает 1 (false будет отображать 0).

Вы можете исправить это, загрузив конфигурационный файл изначально в частный конструктор. Это также ускорит ваш код, потому что файл не нужно загружать каждый раз, когда вы вызываете get() в свой класс Config.

class Config 
{ 

    /** 
    * @var Config 
    */ 
    private static $_instance = null; 

    /** 
    * @var array 
    */ 
    private $config; 

    /** 
    * Config constructor. 
    */ 
    private function __construct() 
    { 
     $this->config = require_once('system/config/config.php'); 
    } 

    /** 
    * Returns the instance. 
    * 
    * @static 
    * @return \Config 
    */ 
    public static function getInstance() 
    { 
     if (self::$_instance == null) { 
      self::$_instance = new Self; 
     } 

     return self::$_instance; 
    } 

    /** 
    * Get a config item. 
    * 
    * @param $path 
    * 
    * @return mixed 
    */ 
    public function get($path) 
    { 
     if (isset($path)) { 
      $path = explode('.', $path); 
      $config = $this->config; 

      foreach ($path as $key) { 
       if (isset($config[$key])) { 
        $config = $config[$key]; 
       } 
      } 

      return $config; 
     } 
    } 

    private function __clone() {} 
    private function __wakeup() {} 

    public function __destruct() 
    { 
     self::$_instance = null; 
    } 
} 

Обратите внимание, что метод getInstance() должен быть объявлен статическим.

+0

Работы, спасибо :) – Tafelglotzer