我有问题。我创建了一个单例配置类,但是当我有多个变量要获取时,它返回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;
}
}
?>
答案 0 :(得分:0)
这是预期的行为。如果以前需要该文件,require_once
将返回true
。此行为适用于PHP中的所有* _once函数,例如include_once
。回应true
显示1
(false
会显示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()
方法应声明为静态。