Welcome to the website navigation,本站只接受合法正规的企业网站,欢迎站长们提交你的网站获得展示和流量有任何问题请联系站长,欢迎大家加入本站。

                
提交网站
  • 网站:76083
  • 待审:5
  • APP:577
  • 文章:304411
  • 会员:56004
文字内链包年1000元 文字内链包年1000元 文字内链包年1000元 AI办公网站 AI绘画工具 AIchat

名站导航为爱好php程序的朋友们提供php相关的教程知识。

在PhP程序语言中,变量都是保存在哈希表中,称为变量符号表,其中变量名为哈希表的键,变量名对应的容器zval的指针为哈希表中的值。所有全局变量放在一张主符号表中(也就是数组$GLOBALS对应的哈希表)。PhP程序语言有个特性,变量在命名时,$变量标识符后不能以数字开头。例如我们在以下具体代码如下:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php
$111= "zzarea";
?>

会报如下错误:Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in...NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

从错误的描叙来看,这是一个语法错误,于是我们推论对变量名合法性的判断应该是在编译时的语法分析阶段。为了证明观点,我们可以试着在执行阶段定义一个数字字符开头的变量:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php
$a = 111;
$$a = "zzarea"; //以变量$a的值作为变量名
echo $$a;
var_dump($GLOBALS);
?>

运行之后发现不报错,并且在全局符号表$GLOBALS中发现相关符号:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

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

这样我们就定义了一个全数字字符命名的变量,似乎违背了PhP程序的规则,但是确实做到了。(读者可以试着输出$GLOBALS["111"]的值,虽然有值,但是结果却为NULL,这个是PhP程序中一个类型转换的特性)NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

在这段具体代码如下中,$$a = "zzarea"这条语句具有多态性,只有当实际执行到这条语句的时候,我们才能确定变量名,PhP程序在语法分析阶段无法知道这个变量名会是什么,所以就不会报错,在执行阶段,PhP程序语言不判断变量名的合法性,于是就产生了这样一个叛逆的变量。NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

知道了这个特性之后,马上会想到一个另外一个特殊的变量:$this,在类的方法中,$this关键字用来指向当前类的对象具体实例操作,如果对$this进行赋值操作,会发生什么事情?NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

<?php  
class Person  
{  
    protected $_name = "phper";  
  
    protected $_age  = 18;  
  
    public function getName()  
    {  
        $this = 123;  
        return $this->_name;  
    }  
  
    public function getAge()  
    {  
        return $this->_age;  
    }  
}  
  
  
$p = new Person();  
$p->getName();  
?>

执行具体代码如下,报错:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

Fatal error: Cannot re-assign $this in...

PhP程序对$this变量做了一定保护措施,但是这个保护措施也不是完全的,我们利用前面的方法在执行期改变$this的值, 修改后的getName方法为:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

public function getName()  
{  
    $a = "this";  
    $$a = 123;  
    echo $this;  
    return $this->_name;  
}

然后执行具体代码如下,发现能够顺利执行,$this的值变成了123, 由此可以判断对$this关键字的保护也仅限与语法分析阶段。NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

当$this的值变成123之后,按理说$this->_name肯定会报错的,但是居然具体代码如下能正常执行,这个确实很让人觉得不可思议。于是推断 $this->_name这样的引用方式和一般的对象变量引用方式在有差异,我们继续对getName做修改:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

public function getName()  
{  
    $a = "this";  
    $$a = 123;  
    $b = 123;  
    echo $this;  
    echo $b;  
    $this->getAge();  
    $b->getAge();  
    return $this->_name;  
}

这段具体代码如下中,$this和$b的值都等于123,但是$this->getAge()可以顺利执行,$b->getAge()却报错:Fatal error: Call to a member function getAge() on a non-object...NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

这是一个诡异的问题,于是可以推断$this->getAge()和$b->getAge()在编译之后对应的op handler肯定有所差异,于是查看之。NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

通过vld查看op的信息:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

$this->getAge()对应的为: ZEND_INIT_METhOD_CALL RES[IS_UNUSED] OP1[IS_UNUSED] OP2[  IS_CONST (8142027) 'getAge' ]NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

$b->getAge()在对应的为: ZEND_INIT_METhOD_CALL RES[IS_UNUSED] OP1[IS_CV !0 ] OP2[ ,  IS_CONST (8142039) 'getAge' ]NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

虽然对应了同样的op code,但是由于操作数的不同(前者不使用OP1,后者使用OP1, 且OP1的值!0表示$b),同一个op code对应同一类handler,然后根据操作数的类型确定到此类handler中的某一个handler。NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

$this->getAge()对应的handler处理为:ZEND_INIT_METhOD_CALL_SPEC_UNUSED_CONST_hANDLERNERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

$b->getAge()    对应的handler处理为:ZEND_INIT_METhOD_CALL_SPEC_CV_CONST_hANDLERNERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

这就是它们的差异了,在执行:NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

$my = new Person();
$name = $my->getName();

调用getName的时候,getName()的作用域(scope)已经被设置成$name对象中,语法分析的时候对于getName中$this->getAge()这样的调用时只是在当前作用域(scope)中调用getAge()函数,不会理会$this的具体值,而在$b->getAge()这样的调用时,会关心$b所对应的值。NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!


NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

名站网址导航

PhP程序内核探索:变量的value和type存储NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

NERAIChat_企业网址导航_网址分类目录_企业黄页网址提交查询专业网站!

好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,

标签:

分享到:

  admin

注册时间:

网站:0 个   APP:3 个  文章:0 篇

  • 76083

    网站

  • 577

    APP

  • 304411

    文章

  • 56004

    会员

赶快注册账号,推广您的网站吧!
文章分类
热门网站
最新入驻APP小程序

宝贝市场2023-02-08

宝贝市场——买手和卖家商品展示

夺宝助手2023-02-08

夺宝助手小程序,查看每日快夺宝平

查诚信2023-02-08

查诚信是一款免费的商业查询工具

车价天天报2023-02-08

快速连接汽车销售,获知汽车最新报

考勤助理小程序2023-02-08

上班签到考勤,实时定位,后台轻松

汽车报价大全查询2023-02-08

汽车报价大全查询提供最新汽车市