Singleton配置类返回1

时间:2015-12-07 23:33:08

标签: php singleton config

我有问题。我创建了一个单例配置类,但是当我有多个变量要获取时,它返回1.

示例:

$config = Config::getInstance();

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

工作正常,返回" localhost"。

BUT:

$config = Config::getInstance();

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

返回" localhost",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;
    }
}

?>

1 个答案:

答案 0 :(得分:0)

这是预期的行为。如果以前需要该文件,require_once将返回true。此行为适用于PHP中的所有* _once函数,例如include_once。回应true显示1false会显示0)。

您可以通过最初在私有构造函数中加载配置文件来解决此问题。这也会加快您的代码速度,因为每次在Config类上调用get()时都不必加载该文件。

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()方法应声明为静态。