代码说

code is poetry

代码说    
碎碎念:我胡汉三又回来啦!  换一换

深入理解php中的return语句

作者:coderzheng 发布于:2016-7-27 9:54 Wednesday 分类:php  阅读模式

最近两三年,php框架开始广泛使用在配置文件中直接return array(...这种方式来完成应用的配置。那么,这种方式究竟是如何实现的呢?要理解这种方式,首先要理解return语句的用法,看手册的解释:
如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。 return 也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include 的或者 require 的,则控制交回调用文件。此外,如果当前脚本是被 include 的,则 return 的值会被当作 include 调用的返回值。如果在主脚本文件中调用 return ,则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。
更多信息见返回值。
总结一下:
1) 在函数中调用return,直接将后面的表达式计算值作为返回值返回;
2) 在全局范围中调用,脚本会中止运行,如果当前脚本文件是被include或者require的,则控制交回调用文件并且return值作为返回值;
3) 在主脚本中调用return,脚本会中止运行。
以thinkphp为例,一种典型的使用方法如下:
// 加载模块配置文件
if(is_file(MODULE_PATH.'Conf/config.php'))
      C(include MODULE_PATH.'Conf/config.php');

/**
* 获取和设置配置参数 支持批量定义
* @param string|array $name 配置变量
* @param mixed $value 配置值
* @param mixed $default 默认值
* @return mixed
*/
function C($name=null, $value=null,$default=null) {
    static $_config = array();
    // 无参数时获取所有
    if (empty($name)) {
        return $_config;
    }
    // 优先执行设置获取或赋值
    if (is_string($name)) {
        if (!strpos($name, '.')) {
            $name = strtoupper($name);
            if (is_null($value))
                return isset($_config[$name]) ? $_config[$name] : $default;
            $_config[$name] = $value;
            return;
        }
        // 二维数组设置和获取支持
        $name = explode('.', $name);
        $name[0]   =  strtoupper($name[0]);
        if (is_null($value))
            return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : $default;
        $_config[$name[0]][$name[1]] = $value;
        return;
    }
    // 批量设置
    if (is_array($name)){
        $_config = array_merge($_config, array_change_key_case($name,CASE_UPPER));
        return;
    }
    return null; // 避免非法参数
}
我们看到C方法直接include配置文件,如果配置文件返回值是一个数组,将执行代码段if (is_array())后面的部分。其实这就是return语句在本文开头阐述的第二种使用方式。

标签: php

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 解决在kohana3.0框架中执行默认的welcome控制器时碰到的fatal error  |  下一篇:解决在php5.5中使用Curl类时爆出的Warning: curl_setopt(): cannot represent a stream of type MEMORY as a STDIO FILE*