php对象:对象传入函数问题?

<?phpclassperson{public$name;function__construct($name){$this->name=$name;}function__... <?php
class person{
public $name;
function __construct($name){
$this->name=$name;
}
function __destruct(){
echo $this->name.'被释放<br />';
}
}
function test($p1){
$p1=new person('2');
}
$p1=new person('1');
echo $p1->name.'<br />';
test($p1);
echo $p1->name.'<br />';
?>
既然传递对象的时候传递的是地址,那为什么$p1没有被改变?
展开
 我来答
不二进制
推荐于2018-04-12 · TA获得超过749个赞
知道小有建树答主
回答量:441
采纳率:50%
帮助的人:320万
展开全部
函数在调用的时候,参数会被重新开辟内存空间的。
也就是说:

你传值穿的是$p1,但在函数test运行的时候会另开辟一个空间,复制一遍$p1,之后再函数中操作的内存都是这个函数新开辟的空间。在这个函数test消亡的时候,这个空间被释放。

所以说你这个根本就没有修改了$p1的值,只是复制了一遍,然后改了,然后删了。

如楼上说的,如果你在参数前面加上"&"符号,这个叫引用。则在参数运行的时候不会另外的开辟内存空间,而是用你的参数的内存空间。

对于函数你可以看看c或者c++语言的函数部分,他们是一样的。给你个例子:
<?php
function swap(&$a,$b){//$a$b叫形参,只是在表示第一个参数第二个参数
$a=20;
$b=10;
}
$x=10;
$y=20;
swap($x,$y);//swap中第一个参数是带引用的,被改变了值,第二个参数没有引用,并不会改变参数的值
echo "x=".$x." y=".$y;//结果 x=20 y=20
?>
追问
name=$name;
}
function __destruct(){
echo $this->name.'被释放';
}
}
function test($p1){
$p1->name='3';
}
$p1=new person('1');
echo $p1->name.'';
test($p1);
echo $p1->name.'';
?>
那为什么改为$p1->name='3';这句又能够执行呢?
追答

因为$p1是一个对象。

这个参考c++语言的面向对象,或者普通的数组都可以,他们都是记录的是你当前的这个对象的内存地址,也就是指针。

 

 

也就是说你这个test函数传的参数是原先 person('1') 的内存地址

那么在函数运行的时候会开辟一个指针的内存把$p1的内存地址复制过来,那么你通过 -> 的方法修改的时候当然修改的就是原先 person('1')的内存了。

 

 

php没有了指针的概念。

但是php毕竟是c语言写的,这些东西还是不可能完全消失,还是有指针的影子。两个函数的区别我给你用图画出来吧!


百度网友9fd28e4
2013-01-27 · TA获得超过490个赞
知道小有建树答主
回答量:496
采纳率:100%
帮助的人:266万
展开全部
传递对象的时候是地址吗?我怎么没听过?php自定义的函数的参数,如果只是写个变量名,那么是传值,变量名前面加个&,是传地址。你把函数改成:function test(&$p1),是传地址的,可以得到你预想的效果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式