在学习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学习可定是比较模糊的,所以,至少应该做到了解,以上仅仅是我的理解,仅供参考,忘指正。