php中global和$GLOBALS 的区别

PHP全局变量详解
本文深入探讨PHP中全局变量的使用方式,包括如何通过global关键字在函数内访问全局变量,以及如何利用$GLOBALS数组来操作所有全局变量。通过实例展示了变量的作用域、生命周期及超全局变量的应用。
<?php
$str = 'hello baby!';
function say()
{
    global $str;
    $str = 'hello honey!';
}
say();
echo $str;  //输出hello honey!
?>

$str 是一个全局变量,而这个全局变量在php程序中的函数中是不能访问的。

看上面的代码,按我的理解,global $str;  say()函数在栈区中开辟空间时,say()函数中$str就像c语言的指针一样指向了函数外部的同名变量$str, 所以我们可以通过say函数内部的$str去改变全局变量的值。

php变量的生命周期中,定义在函数体外部的所谓 全局变量,函数内部是不能直接获得的。所以可以用global予以获取。看下面的代码:

<?php
$str = 'hello baby!';
function say()
{
    global $str;
    unset($str);
}
say();
echo $str;    //输出 hello baby!
?>
这就证明了say()函数内部的$str就是个函数外部的全局变量$str的一个别名引用,其底层就是一个c语言的指针。

那$GLOBALS呢?这是一个超全局变量(Superglobal),如$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV.。

而$GLOBALS,引用全局作用域中可用的全部变量。一个包含了全部变量的全局组合数组。变量的名字就是数组的键。即出现过的全局变量,就可以通过$GLOBALS这个数组取得。看代码:

<?php
$name = 'tagore';
$age = 80;
$saying = 'Wrong cannot afford defeat but rain can';
$saying1 = 'I can\'t choose the best, The best choose me!';
function show()
{
    echo $GLOBALS['name'], ' said \'', $GLOBALS['saying1'], '\'<br />';
    unset($GLOBALS['saying']);
}
echo '<pre>';
print_r($GLOBALS);
show();  //调用show函数
print_r($GLOBALS);
echo '</pre>';
?>


输出结果:

Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_POST] => Array
        (
        )

    [_GET] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [name] => tagore
    [age] => 80
    [saying] => Wrong cannot afford defeat but rain can
    [saying1] => I can't choose the best, The best choose me!
)
tagore said 'I can't choose the best, The best choose me!'
Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_POST] => Array
        (
        )

    [_GET] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [name] => tagore
    [age] => 80
    [saying1] => I can't choose the best, The best choose me!
)

$GLOBALS是由所有已定义全局变量自动形成的数组。变量名就是该数组的索引。即$GLOBALS[’saying‘]与函数外部的变量$saying是同一个变量,
所以将$GLOBALS['saying'] 删除后,该变量已不存在,所有无法输出了。

特与大家分享,如有问题,多多指教。

<think>嗯,用户给了一段PHP代码,让我解释一下。首先,我需要仔细看一下这段代码的结构功能。看起来像是处理API包含全局变量管理的。 首先,代码开头有static $s_api_included;,这里声明了一个静态变量,用来记录哪些API已经被包含过,避免重复加载。接着用global $g_core_path;引入了一个全局变量,应该是核心路径。然后检查$s_api_included数组中是否已经存在当前API名,如果没有,就执行require_once包含对应的文件。 接下来,使用get_defined_vars()获取当前定义的变量,然后通过array_diff_key排除$GLOBALS自身$t_new_globals,这样得到新加载的变量。然后遍历这些变量,将它们添加到$GLOBALS中,确保全局可用。最后标记该API为已加载。 需要确认用户是否了解静态变量全局变量的作用,以及他们是否在使用旧版PHP,因为array_diff_key的参数顺序可能影响结果。另外,这种全局变量管理方式可能存在安全隐患,比如变量覆盖,需要提醒用户注意。可能用户是在维护一个老项目,遇到变量作用域的问题,或者想优化资源加载。需要解释清楚代码的逻辑潜在问题,帮助他们理解或改进代码。</think>这是典型的PHP模块加载代码,我为您逐行分析其实现原理: ```php static $s_api_included; // 静态变量记录已加载的API global $g_core_path; // 引入核心路径全局变量 if( !isset( $s_api_included[$p_api_name] ) ) { // 检查是否已加载过该API require_once( $g_core_path . $p_api_name ); // 加载指定API文件 $t_new_globals = array_diff_key( get_defined_vars(), // 获取当前所有变量 $GLOBALS, // 排除已有全局变量 array( 't_new_globals' => 0 ) // 排除临时变量自身 ); foreach ( $t_new_globals as $t_global_name => $t_global_value ) { $GLOBALS[$t_global_name] = $t_global_value; // 将新变量提升为全局 } $s_api_included[$p_api_name] = 1; // 标记该API已加载 } ``` 主要功能特点: 1. **单次加载机制**:通过静态变量`$s_api_included`确保API文件只被加载一次 2. **全局变量提升**:使用`array_diff_key`对比加载前后变量差异,将新定义的变量自动注册为全局变量 3. **路径拼接**:利用`$g_core_path`全局变量构建完整文件路径 ⚠️ 注意:这种自动提升变量的做法在PHP 5.3+中存在兼容性问题(array_diff_key参数顺序问题),且存在安全隐患(可能意外覆盖全局变量),现代框架通常使用自动加载器(autoloader)替代这种模式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值