函数中使用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新手上路(六)
Oct 09 PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
php注册登录系统简化版
Dec 28 PHP
php实现图片缩略图的方法
Mar 29 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
Laravel学习教程之路由模块
Aug 18 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
tp5.1 框架join方法用法实例分析
May 26 PHP
PHP实现抽奖功能实例代码
Jun 30 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 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP多进程编程实例详解
2017/07/19 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
js输出列表实现代码
2010/09/12 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
Python的Flask开发框架简单上手笔记
2015/11/16 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
英语自我评价范文
2014/01/24 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
大学生心理活动总结
2014/07/04 职场文书
美术学专业求职信
2014/07/23 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS
Redis全局ID生成器的实现
2022/06/05 Redis
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers