函数中使用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 相关文章推荐
Cannot modify header information错误解决方法
Oct 08 PHP
一步一步学习PHP(8) php 数组
Mar 05 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
May 10 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
php中日期加减法运算实现代码
Dec 08 PHP
apache mysql php 源码编译使用方法
May 03 PHP
PHP URL路由类实例
Nov 12 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
PHP中foreach()用法汇总
Jul 02 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
Laravel模型事件的实现原理详解
Mar 14 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数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
Window下PHP三种运行方式图文详解
2013/06/11 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
JavaScript入门之基本函数详解
2011/10/21 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
vue实现扫码功能
2020/01/17 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
python中实现k-means聚类算法详解
2017/11/11 Python
python实现kNN算法
2017/12/20 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
python如何实现复制目录到指定目录
2020/02/13 Python
Python txt文件如何转换成字典
2020/11/03 Python
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书