函数中使用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序列号生成函数和字符串替换函数代码
Jun 07 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
php调用shell的方法
Nov 05 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
php简单处理XML数据的方法示例
May 19 PHP
PHP实现权限管理功能示例
Sep 22 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 PHP
php屏蔽错误及提示的方法
May 10 PHP
PHP执行系统命令函数实例讲解
Mar 03 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中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
React diff算法的实现示例
2018/04/20 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
Python实现的Kmeans++算法实例
2014/04/26 Python
详解Python迭代和迭代器
2016/03/28 Python
python实现可变变量名方法详解
2019/07/01 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
python 追踪except信息方式
2020/04/25 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
应届大学生的推荐信
2013/11/20 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
汽车转让协议书
2015/01/29 职场文书
2015中秋祝酒词
2015/08/12 职场文书
诚实守信主题班会
2015/08/13 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
python基础之类方法和静态方法
2021/10/24 Python