函数中使用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初学者头痛的十四个问题
Jul 12 PHP
php教程之phpize使用方法
Feb 12 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
分享一个php 的异常处理程序
Jun 22 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
php提交表单发送邮件的方法
Mar 20 PHP
PHP加密解密函数详解
Oct 28 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 PHP
php适配器模式简单应用示例
Oct 23 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 cURL初始化和执行方法入门级代码
2015/05/28 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
表单内同名元素的控制
2006/11/22 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
JavaScript实现HSL拾色器
2020/05/21 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python端口扫描系统实现方法
2014/11/19 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
幼儿园健康教育方案
2014/06/14 职场文书
简历自荐信范文
2015/03/09 职场文书
毕业生入职感言
2015/07/31 职场文书
环保建议书作文400字
2015/09/14 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书