网络编程 
首页 > 网络编程 > 浏览文章

函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐

(编辑:jimmy 日期: 2026/1/20 浏览:3 次 )

背景

在项目中很多人喜欢在配置文件使用数组来配置各个配置项,如等级的配置level.config.php:
复制代码 代码如下:
<"codetitle">复制代码 代码如下:
function getNameByLeval($level){
    $level = intval($level);
    require_once CONFIG_PATH.'level.config.php';
    if(!isset($g_levelConfig[$level])){
        return false;
    }else{
        return $g_levelConfig[$level];
    }
}

问题

那么这样会有什么问题呢?先看如下代码的输出,level.config.php即是上文提到的配置文件
复制代码 代码如下:
<"codetitle">复制代码 代码如下:
string(6) "新手"
bool(false)

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

require_once只包含一次文件,如果该文件已经被包含了,则不会再次包含。

1.第一次执行getNameByLeval(1)时因为之前没包含level.config.php配置文件,所以本次会包含level.config.php文件并编译,所有函数里有$g_levelConfig变量;

2.当第二次执行getNameByLeval(1)时,因为之前包含过level.config.php配置文件,本次不再包含,所以就没有$g_levelConfig变量,自然返回false;

解决办法

1.在全局作用于包含,在函数中引用
复制代码 代码如下:
<"codetitle">复制代码 代码如下:
<"codetitle">复制代码 代码如下:
<"codetitle">复制代码 代码如下:
function getNameByLeval($level){
    $level = intval($level);
    require_once 'level.config.php';
    if(!isset(levelConfig::$level[$level])){
        return false;
    }else{
        return levelConfig::$level[$level];
    }
}

我个人非常推崇这个方式来定义配置文件,用起来优雅而且不容易覆盖变量。

上一篇:用PHP解决的一个栈的面试题
下一篇:PHP中遇到BOM、<feff>编码导致json_decode函数无法解析问题
一句话新闻
一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?