函数中使用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下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
php数组添加元素方法小结
Dec 20 PHP
Java中final关键字详解
Aug 10 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
详解php用static方法的原因
Sep 12 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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
图书管理程序(一)
2006/10/09 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
全面了解js中的script标签
2016/07/04 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python实现随机漫步功能
2018/07/09 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
python getopt模块使用实例解析
2019/12/18 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
Python使用re模块验证危险字符
2020/05/21 Python
python中Mako库实例用法
2020/12/31 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
课外活动总结范文
2014/07/09 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
大学生学期个人总结
2015/02/12 职场文书
八一建军节主持词
2015/07/01 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python