函数中使用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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
实用函数4
Nov 08 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
简单的cookie计数器实现源码
Jun 07 PHP
Php header()函数语法及使用代码
Nov 04 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
php广告加载类用法实例
Sep 23 PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 PHP
浅谈PHP匿名函数和闭包
Mar 08 PHP
如何用PHP websocket实现网页实时聊天
May 26 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
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python中的闭包详细介绍和实例
2014/11/21 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
公司庆典活动邀请函
2014/01/09 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
信息技术教学反思
2014/02/12 职场文书
工程建设实施方案
2014/03/14 职场文书
销售员岗位职责范本
2015/04/11 职场文书
企业愿景口号
2015/12/25 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
高考升学宴主持词
2019/06/21 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
Github 使用python对copilot做些简单使用测试
2022/04/14 Python