函数中使用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安全配置
Dec 06 PHP
ajax缓存问题解决途径
Dec 06 PHP
php join函数应用
May 04 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
php json转换相关知识(小结)
Dec 21 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
Laravel 读取 config 下的数据方法
Oct 13 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 array操作10个小技巧分享
2011/06/23 PHP
探讨php中header的用法详解
2013/06/07 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
js 操作符实例代码
2009/10/24 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
机房搬迁方案
2014/05/01 职场文书
见习报告怎么写
2014/10/31 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2014年英语工作总结
2014/12/20 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
Python基础之元组与文件知识总结
2021/05/19 Python
如何用python清洗文件中的数据
2021/06/18 Python
Golang jwt身份认证
2022/04/20 Golang
app场景下uniapp的扫码记录
2022/07/23 Java/Android