PHP - 对象详解 - 学习/实践

1.应用场景

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

2.学习/操作

查看源图像

 

1. 文档

PHP: 对象和引用 - Manual

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

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

2. 整理输出

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

见手册

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

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

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

在 PHP 5,一个对象变量已经不再保存整个对象的值。

只是保存一个标识符来访问真正的对象内容。

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

插入

其实不单单是对象,而是所有的变量,本质上是内存

PHP - 垃圾回收机制收集_william_n的博客-CSDN博客

手册上例子,这里省略.

代码执行情况:

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.参考

PHP: 对象和引用 - Manual

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

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

PHP - 垃圾回收机制收集_william_n的博客-CSDN博客

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值