函数中使用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利用cookie实现访问次数统计代码
May 19 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
PHP安装memcached扩展笔记
May 28 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
php表单加入Token防止重复提交的方法分析
Oct 10 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 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
一个ftp类(ini.php)
2006/10/09 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
php实现websocket实时消息推送
2018/03/30 PHP
yii2安装详细流程
2018/05/23 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
微信小程序实现简单表格
2019/02/14 Javascript
js实现select下拉框选择
2020/01/11 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python