我对于调用对象和基本变量类型内存的运行机制理解

在学习php的过程中,才发现这么一个问题: 函数好对象的调用所产生的结果类型是不同的,或者说,在内存里面的操作是不同的,下面是我的php的实例代码:

        

<?php
class Classmate{	//【1】
		public $num1=1;
		public $num2=2;
		public $num3=3;
	}
	///如果参数是对象,那么传递的是对象的地址
	function change($obj){	//【2】
		$obj->num1=4;
		$obj->num2=5;
		$obj->num3=6;
	}
	$myobj = new Classmate();//【3】
	change($myobj);//【4】
	echo $myobj->num1.'<br/>'.$myobj->num2."<br/>".$myobj->num3.'<br/>';
?>

上面的结果是4,5,6;

这个过程是:在一开始第【1】:在堆区建立了一个含有三个变量的对象区域,系统分配给他们地址和值,下面是我做的内纯图:

做这个图的目的是说明: 在程序运行的一开始,这个内存就自然的建立起来了,然后我的总结就是,把对象分配到堆区,把函数分配到栈区。

那么就是说在栈区栈区传递给函数的是对象的地址,而不是数值,这里是和传递变量是不同的,后者是传递的值,那么就得来了,当在栈区的

函数里面对对象的成员属性进行操作是,就是直接指向堆区的对象,然后直接的具体操作,这个过程完成之后,函数结束,随之,它在内存里面

开辟的栈区也就随之销毁,不仅这里,所有的函数都是这个工作机制的,从而,这样完成了数字的修改。


但是,同时想一想,如果是函数对于基本类型的变量进行操作呢,为了说说明语言对于内存操作的一致性,下面第用C++写的一段简单代码:

#include <iostream>

using namespace std;

int jisuan(int x, int y, int z){
        x = 1;
        y = 2;
        z = 3;
        return x;
}
int main()
{
    int a = 4;
    int b = 5;
    int c = 6;
    jisuan(a, b, c);///使用完之后就销毁了
    cout << "在函数里面a的值为:" << jisuan(a,b,c) << endl;
    cout << a << " " << b << " " << c << endl;///在这里依然是原来的内存
}

说明一下:上面代码执行的结果是1,2,3;这样看起来就有点晕了,明明对变量进行修改了啊,为什么没有改变呢,经过学习,我才知道,也就是上面的一段话,就是当函数的参数是基本变量类型的时候,传递给函数的是他们的数值,这时并非地址,同样的,在系统分配的内存图可以这样解释,普通变量是建立在栈区的(起初的初始值就已经建立)

,当我们去调用函数的时候,在栈区,会建立一个对应函数的栈区,说白了就是把abc的值赋值给分配给函数栈区的对应变量,但是,当我们调用函数之后,同样的它的栈就随之的被销毁,自然就不会存在值得改变了,即便不销毁,也不会改变,那么就只剩下起初给的变量,所以,这个过程就不会改变



内存的机制是学习编译原理才会了解到的,但问题是,如果我不了解并学习它,对今后的php学习可定是比较模糊的,所以,至少应该做到了解,以上仅仅是我的理解,仅供参考,忘指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值