背景

在项目中,很多人喜欢使用阵列的配置文件中配置的各种配置项,如层次结构level.config.php:

复制代码代码如下所示:

< PHP

g_levelconfig美元=阵列(

1= > 'novice,

2= > 'advanced,

);



因为一个项目的不同模块经常互相调用,所以会出现一个文件的重复。为了避免错误,人们通常使用require_one,通常包括文件的功能,如:

复制代码代码如下所示:

功能getnamebyleval(元级){

水平= intval美元(美元的水平);

require_once config_path。'level。配置PHP的;

如果(!isset($ g_levelconfig { $级})){

返回false;

其他{ }

返回的g_levelconfig { $级};

}

}

问题

那有什么问题呢先看看下面的代码输出,level.config.php是上面提到的配置文件

复制代码代码如下所示:

< PHP

功能getnamebyleval(元级){

水平= intval美元(美元的水平);

require_once'level。配置PHP的;

如果(!isset($ g_levelconfig { $级})){

返回false;

其他{ }

返回的g_levelconfig { $级};

}

}

var_dump(getnamebyleval(1));

var_dump(getnamebyleval(2));

输出是:

复制代码代码如下所示:

字符串(6)新手

Bool(假)

很多人觉得很奇怪,为什么第二个输出是假的,其实很简单:

的require_once只包含一个文件,如果文件已经包含,它不会被再次列入。

1,这是第一次,当getnamebyleval(1)被执行死刑,因为level.config.php配置文件不包含以前的level.config.php文件编译和编译。在所有有功能g_levelconfig美元变量。

2、当执行getnamebyleval(1)的第二次,因为level.config.php配置文件已经包含之前,这一次不再收录,所以没有g_levelconfig美元变,这自然会返回FALSE。

和解条款

1。在全球的作用中纳入,参考作用。

复制代码代码如下所示:

< PHP

require_once'level。config. php; / /添加代码

功能getnamebyleval(元级){

全球g_levelconfig美元; / /添加代码

水平= intval美元(美元的水平);

如果(!isset($ g_levelconfig { $级})){

返回false;

其他{ }

返回的g_levelconfig { $级};

}

}

var_dump(getnamebyleval(1));

var_dump(getnamebyleval(2));

在这种情况下,无论getnamebyleval的使用功能,这level.config.php配置文件应包括,一点不划算。

2。包括和应用于功能

复制代码代码如下所示:

< PHP

功能getnamebyleval(元级){

水平= intval美元(美元的水平);

全球g_levelconfig美元; / /添加代码

require_once'level。配置PHP的;

如果(!isset($ g_levelconfig { $级})){

返回false;

其他{ }

返回的g_levelconfig { $级};

}

}

var_dump(getnamebyleval(1));

var_dump(getnamebyleval(2));

它也觉得不干净和美丽。

三.配置文件使用静态类

复制代码代码如下所示:

< PHP

类levelconfig {

公共静态级别=数组(

1= > 'novice,

2= > 'advanced,

);

}

当使用

复制代码代码如下所示:

功能getnamebyleval(元级){

水平= intval美元(美元的水平);

require_once'level。配置PHP的;

如果(!isset(levelconfig::$ { $级水平){ })

返回false;

其他{ }

返回levelconfig::{ }美元美元级水平;

}

}



我个人很欣赏定义一个优雅且不易覆盖变量的配置文件的方式。