函数中使用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操作excel文件 基于phpexcel
Jul 02 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php常用hash加密函数
Nov 22 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
两款万能的php分页类
Nov 12 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
Thinkphp5.0 框架Model模型简单用法分析
Oct 11 PHP
详解PHP中curl_multi并发的实现
Jun 08 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数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python读取mysql数据绘制条形图
2020/03/25 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
幼儿教师自我鉴定
2013/11/02 职场文书
批评与自我批评材料
2014/02/15 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
授权委托书协议书
2014/10/16 职场文书
委托书英文
2015/01/28 职场文书
病假证明模板
2015/06/19 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
jquery插件实现搜索历史
2021/04/24 jQuery
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis