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


Posted in PHP onJuly 02, 2014

背景

在项目中很多人喜欢在配置文件使用数组来配置各个配置项,如等级的配置level.config.php:

<?php 

$g_levelConfig = array( 

                    '1'=>'新手', 

                    '2'=>'进阶', 

                );

因为项目不同模块经常会相互调用方法,会出现重复包含一个文件的情况,为了避免错误,大家一般都会用require_one,而且经常会在函数里包含文件,如:
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即是上文提到的配置文件

<?php

function getNameByLeval($level){

    $level = intval($level);

    require_once 'level.config.php';

    if(!isset($g_levelConfig[$level])){

        return false;

    }else{

        return $g_levelConfig[$level];

    }

}

var_dump(getNameByLeval(1));

var_dump(getNameByLeval(2));

输出是:

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.在全局作用于包含,在函数中引用

<?php

require_once 'level.config.php';//新增代码

function getNameByLeval($level){

    global $g_levelConfig;//新增代码

    $level = intval($level);

    if(!isset($g_levelConfig[$level])){

        return false;

    }else{

        return $g_levelConfig[$level];

    }

}

var_dump(getNameByLeval(1));

var_dump(getNameByLeval(2));
  
这样的话,无论用不用getNameByLeval函数,都要把level.config.php配置文件包含进来,有点不划算。

2.在函数中包含、应用

<?php

function getNameByLeval($level){

    $level = intval($level);

    global $g_levelConfig;//新增代码

    require_once 'level.config.php';

    if(!isset($g_levelConfig[$level])){

        return false;

    }else{

        return $g_levelConfig[$level];

    }

}

var_dump(getNameByLeval(1));

var_dump(getNameByLeval(2));

这样也感觉很不整洁美观

3.配置文件使用静态class

<?php

class levelConfig{

    public static $level = array(

                                '1'=>'新手',

                                '2'=>'进阶',

                            ); 

}

使用的时候

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 缓冲的免费实现方法
Oct 09 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
php+javascript的日历控件
Nov 19 PHP
php文件上传的例子及参数详解
Dec 12 PHP
thinkphp实现多语言功能(语言包)
Mar 04 PHP
四个PHP非常实用的功能
Sep 29 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
php实现的表单验证类完整示例
Aug 13 PHP
php+redis实现消息队列功能示例
Sep 19 PHP
php报错502badgateway解决方法
Oct 11 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 #PHP
php foreach正序倒序输出示例代码
Jul 01 #PHP
浅析ThinkPHP的模板输出功能
Jul 01 #PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 #PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 #PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 #PHP
ThinkPHP框架实现session跨域问题的解决方法
Jul 01 #PHP
You might like
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
python私有属性和方法实例分析
2015/01/15 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
python文本数据相似度的度量
2018/03/12 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
2014年大学生自我评价
2014/01/19 职场文书
幼教求职信
2014/03/12 职场文书
秘书英文求职信
2014/04/16 职场文书
优秀员工演讲稿
2014/05/19 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
财务经理岗位职责
2015/01/31 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
用python自动生成日历
2021/04/24 Python
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android