神秘的变量名特性

本文探讨了PHP语言中变量存储于符号表的特性,以及在PHP中以数字开头的变量名在特定情况下如何创建。文章通过示例展示了在运行时如何创建全数字变量名,并解释了为何在某些情况下变量命名的检查仅在语法分析阶段进行。同时,文章讨论了$this关键字在类方法中的行为,以及如何在执行期间更改其值,以及这种操作带来的影响。通过对代码的分析和错误信息,揭示了PHP中方法调用处理的细节差异。
摘要由CSDN通过智能技术生成

    在PHP语言中,变量都是保存在哈希表中,称为变量符号表,其中变量名为哈希表的键,变量名对应的容器zval的指针为哈希表中的值。所有全局变量放在一张主符号表中(也就是数组$GLOBALS对应的哈希表)。PHP语言有个特性,变量在命名时,$变量标识符后不能以数字开头。例如我们在以下代码:

<?php

$111= "my";

?>

会报如下错误:Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in...

 

从错误的描叙来看,这是一个语法错误,于是我们推论对变量名合法性的判断应该是在编译时的语法分析阶段。

为了证明观点,我们可以试着在执行阶段定义一个数字字符开头的变量:

<?php

$a   = 111;

$$a = "my"; //以变量$a的值作为变量名

echo $$a;

var_dump($GLOBALS);

?>

运行之后发现不报错,并且在全局符号表$GLOBALS中发现相关符号:

  ["a"]=>
  int(111)
  ["111"]=>
  string(2) "my"

 

这样我们就定义了一个全数字字符命名的变量,似乎违背了PHP的规则,但是确实做到了。

(读者可以试着输出$GLOBALS["111"]的值,虽然有值,但是结果却为NULL,这个是PHP中一个类型转换的特性)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值