PHP 对象详解

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:30   1343   0

1.应用场景

了解PHP对象的用法. 合理使用其进行开发.

2.学习/操作

1. PHP对象到底是值传递还是引用传递

手册:

在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。

下面通过一些例子来说明。

PHP 的引用是别名,就是两个不同的变量名字指向相同的内容

在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。

当对象作为参数传递,作为结果返回,

或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

手册上例子:

这里省略.

代码执行情况:

class A{

}
$a=new A;
$b=$a;
$a->name='haha';
echo '<pre>';
var_dump($b);
var_dump($a);
echo '<hr/>';
function test($obj){
$obj->name='xixi';
}
test($a);
var_dump($b);
var_dump($a);
echo '<hr/>';
$a=100;
var_dump($a);
var_dump($b);

网友一:

对象在函数中是引用传递

即使赋值给其它变量,也是引用

但是改变了$a的类型,准确的说是zval.value指针都变化了,所以此时产生了分裂。

所以:

尽量避免函数内操作外部对象,否则有可能造成致命性的逻辑错误,特别是改变对象数据的时候。
或者在做对象数据传递的时候要注意数据的严谨性。

网友二:

$a和$b是同一个标示符的拷贝,都是指向同一个对象A,所以你改变$a或者$b的属性, 其实也就是改变的同一个对象A的属性,

但是$a和$b是两个不同的变量,他们两个不是引用关系。


$a=100, 这里$a已经是变成整数类型,不再指向对象A了,$b还是指向的对象A。
$b = &$a;你改成这样,$a和$b就是引用关系,后面$b也会输出为100。

网友三:

其实$a$b都是指向的是对象的标识符,也就是你输出时看到的#1,而这个标识符才是指向的对象。

而当你设置了$b=100时,此时改变了$b的指向,但是并不会影响$a的指向。

关键点:

造成这种疑问的,都是把引用当成指针去理解了.

个人建议:

不要轻易去操作对象, 如果可以使用数组去代替.

后续补充

...

3.问题/补充

TBD

4.参考

https://www.php.net/manual/zh/language.oop5.references.php

https://segmentfault.com/q/1010000010641993?_ea=2363326 //PHP对象到底是值传递还是引用传递

https://www.cnblogs.com/aademeng/articles/9194688.html //PHP中对象是按值传递还是按引用传递?

后续补充

...

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP