当前位置: 首页 > 后端技术 > PHP

PHP变量的对象类型变量

时间:2023-03-29 18:27:20 PHP

在PHP和JavaScript(或许还有其他语言)中,变量存储的值分为基本类型值和引用类型值。$obj=新标准类;如果变量是对象,那么变量存储的是引用类型的值,即变量实际存储的是对象在堆内存中的地址,而不是对象的实体;如果变量是其他类型,则保存基本类型的值而不是引用地址。这一点需要特别注意,因为我们可能会遇到以下几种情况,不明确的原则可能会导致错误。赋值$obj_1=newstdClass;$obj_2=$obj_1;$obj_1->name='Xavier';var_dump($obj_1->名称,$obj_2->名称);var_dump($obj_1,$obj_2);输出:字符串(6)“Xavier”字符串(6)“Xavier”对象(stdClass)#1(1){[“name”]=>字符串(6)“Xavier”}对象(stdClass)#1(1){["name"]=>string(6)"Xavier"}我们发现obj_2的名字也变了,因为obj_1和obj_2指向同一个对象#1,因为在第二行,我们设置了指向的对象obj_1地址分配给obj_2。传递参数让我们看一下这段代码://输出string(6)"Xavier"如果变量是对象,那么当它作为参数传递给函数时,也是一个对象地址,而不是复制一个新的对象实体给参数$obj。这样一来,函数不返回新东西而是改变外部状态的情况就变得容易理解了。接下来请看这段代码:functionsetName($obj){$obj->name='Xavier';$obj=新标准类;$obj->name='赵';}$person=newstdClass;setName($person);var_dump($person->name);//最后输出的是string(6)"Xavier"而不是string(6)"Zhao"可能很多人会比较迷惑,他们的思路可能是这样的:我把person对象的引用地址传给了第一行在函数内部,根据obj的引用地址,我设置了函数外部对象的name属性为“Xavier”。第二行,我设置了一个新对象赋值给obj。由于obj是函数外部对象的引用,所以外部对象也必须成为这个新对象。然后我将为这个新对象设置一个新的名称属性“zhao”。那么,这个外部对象的名字也必须变成“zhao”如果你和上面的想法一样,那就大错特错了,原因就在于对传参过程的误解。首先我们要明白,将变量作为参数传递给函数可以理解为将那个变量保存的值复制到函数的参数中(参数是函数作用域内的局部变量)。函数执行时,外部变量和函数参数(局部变量)同时存在于内存中,两者相互独立,虽然两者保存的值相同;函数参数(局部变量)会在函数执行后销毁。明白了上面的原理,我们再来看那段代码:函数的obj变量在函数的第一行保存了函数外部person变量存储的值,也就是外部对象的地址。但是在第二行,obj变量保存的值变成了新建对象的地址,obj的指向变了,原来的外部对象依然存在,只是被person的一个变量引用,所以行为中第三行不影响该对象的人的指向。新创建的对象在函数执行后被销毁。所以代码中有注释的输出结果。