免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2942 | 回复: 7

PHP bug??global发现的问题 [复制链接]

论坛徽章:
0
发表于 2010-05-09 15:15 |显示全部楼层
如下php代码

<?php
$type='a';
$target='type';
$a=array(1,2,3);
a($target);
function a($type)
{
    global $$type;
    var_dump($$type);
}

?>

预计输出的是string(1)”a”

可是结果是

Notice: Undefined variable: a in D:\web\global.php on line 11
NULL

因为global的时候引进了$type,顺便把全局的$type引进了,函数内部的$type的值被修改成了全局的'a',而函数内部又没有$a,所以报错和打印null

不知道这是php的错误还是就是global的机制,不过个人认为这个情况下只引进$type就可以了

论坛徽章:
5
程序设计版块每日发帖之星
日期:2016-06-01 06:20:00数据库技术版块每日发帖之星
日期:2016-06-11 06:20:00操作系统版块每日发帖之星
日期:2016-06-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-07 06:20:00
发表于 2010-05-09 18:22 |显示全部楼层
我原来的想法是:
$$type 相当于$a,所以global $$type相当于global $a 也就是array(1,2,3)这样一个数组,
然后var_dump(array(1,2,3)).........有点犯糊涂了。。。。。

希望高人前来指点

论坛徽章:
0
发表于 2010-05-10 11:32 |显示全部楼层
Note: 可变变量 超级全局变量不能被用作可变变量。

这个是PHP手册中的一句话

根据我的测试 ,可以 理解为 , 如果 一个 变量 是全局变量 , 则 不可能 对其 进行 二次,或 多此 解析

如,LZ 的测试 , $type  已经是 一个 全局变量 了,则

global $type
global $$type
global $$$$...$$type

这些语句是等价 的 其 结果 都是  引入 $type 这个 全局变量
并且 任意多的解析 都 不会 产生 Notice: Undefined variable  信息
那个 Notice: Undefined variable: a 是 函数 var_dump 产生的

所以 在 函数 a 中 引入的 是 $type 这个全局变量,并没有 引入 $a 这个全局 变量

如果 函数 a 的 参数 改成 不和 全局变量 重名 的参数 如 t 等,
函数 a 是可以 正确执行的  并且 会引入 全局变量 $type
此时 引入 语句是 : global $$t ;

但 等 引入 语句 变成 : global $$$t;
并不会 如我们预期的 引入 全局变量 $a ,也不会引入 $type 这个 全局变量 ,并且会 产生
Notice: Undefined variable  信息

这个就不知道是怎么回事了

论坛徽章:
0
发表于 2010-05-10 14:38 |显示全部楼层
回复 3# fly020212


    反复验证,其实没有错误的
   上面的例子只有在函数内部$type=='type'的时候,global才会出现混乱,这主要是逻辑上的
   函数里面:global以前,$type='type',预料$$type='a',其实这个$$type写白老了就是$type,
   global之后,引入了$type,所以$$type其实就是$a,那么函数内部没有定义,所以才会警告并输出null
   ls的都没有正视哦,呵呵

论坛徽章:
0
发表于 2010-05-10 18:07 |显示全部楼层
global一点错都没有,是你自己在搞自己。

论坛徽章:
0
发表于 2010-05-11 09:53 |显示全部楼层
本帖最后由 fly020212 于 2010-05-11 10:02 编辑

回复 4# xiao7ng
你没有看懂我的意思

如下代码
  1. <?php
  2. $type='a';
  3. $target='type';
  4. $a=array(1,2,3);
  5. a($target);
  6. function a($_t)
  7. {
  8.     global $ $_t;
  9.     var_dump($ $_t);
  10. }
  11. ?>
复制代码
我只是把你的代码 函数 a 的 形参名称 由‘ type’ 变成了 ‘_t'

就可以输出 --- 预计输出的是string(1)”a” 了

其实这个$$type写白老了就是$type
为什么你会说 $$type 和 $type 是一样的了? 正如你说的 $type='type', 你也 预料$$type='a'

当然, 在 这个 例子里面 你的 这个 $$type 和 $type 是一样的 是正确的 , 但那是因为
Note: 可变变量 超级全局变量不能被用作可变变量。
你是怎么理解这句话的?

两段代码
  1. <?php
  2. $type='a';
  3. $target='type';
  4. $a=array(1,2,3);
  5. a($target);
  6. function a($type)
  7. {
  8.     global $ $ $ $ $type;
  9. }
  10. ?>
复制代码
  1. <?php
  2. $type='a';
  3. $target='type';
  4. $a=array(1,2,3);
  5. a($target);
  6. function a($_type)
  7. {
  8.     global $ $ $ $ $_type;
  9. }
  10. ?>
复制代码
所以 关键是 $type 是 个 全局变量 , 和 global 对 全局变量 不进行 二次,或多次 解析
当首次 解析的变量 就是全局变量 的时候 global 会引入 到函数中 , 以后的 解析会忽略, 但 若是 解析过程中 出现了 全局变量,当 没有下次解析的时候, global 会引入到函数中, 若 还有下次解析 ,global 会 报 NOTICE 消息,并 且 不会把此时 解析得到的 全局变量 引入到函数中。

论坛徽章:
0
发表于 2010-05-11 11:03 |显示全部楼层
回复 6# fly020212


   

论坛徽章:
0
发表于 2010-05-13 11:30 |显示全部楼层
为什么要这样做呢? 难道真的为了语法糖吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP